1

次のようなSQLテーブルがあります。

テーブル ユーザー

  Id         Name         Country          rank            total
+----+---------------+---------------+-----------------+-------------+
  1          John          Canada                           
  2          Kate          Canada                           
  3          Mark          Canada                           
  4          Max           Argentina                        
  5          Sam           Argentina                        
  6          Stacy         China                            
  7          Ken           China                            
  8          jack          China                            
  9          Don           China                           

と の値を次のように入力rankします。total

  Id         Name         Country          rank            total
+----+---------------+---------------+-----------------+-------------+
  1          John          Canada           1                3
  2          Kate          Canada           2                3
  3          Mark          Canada           3                3
  4          Max           Argentina        1                2
  5          Sam           Argentina        2                2
  6          Stacy         China            1                4
  7          Ken           China            2                4
  8          jack          China            3                4
  9          Don           China            4                4

合計は基本的に各国の合計数であり、ランクはその国で 1、2、3、4.... カウントされているだけです (1 つずつリセットされます)。

それを行うために、私は次のことを試しました:

update Users
 set rank=u.tempRank, total=u.tempTotal
from
(select *,
         row_number() over (partition by [Country] order by newid()) as tempRank,
         count(*) over (partition by [Country]) as tempTotal
  from Users) as u

ただし、ranktotalはすべて最初の tempRank と tempTotal に等しく、このテーブルを取得します

  Id         Name         Country          rank            total
+----+---------------+---------------+-----------------+-------------+
  1          John          Canada           1                3
  2          Kate          Canada           1                3
  3          Mark          Canada           1                3
  4          Max           Argentina        1                3
  5          Sam           Argentina        1                3
  6          Stacy         China            1                3
  7          Ken           China            1                3
  8          jack          China            1                3
  9          Don           China            1                3

内部クエリだけをデバッグしようとすると、次のようになります。

select *,
         row_number() over (partition by [Country] order by newid()) as tempRank,
         count(*) over (partition by [Country]) as tempTotal
  from Users

更新せずに選択するだけで、正しい結果が得られます。

  Id         Name         Country          tempRank        tempTotal
+----+---------------+---------------+-----------------+-------------+
  1          John          Canada           1                3
  2          Kate          Canada           2                3
  3          Mark          Canada           3                3
  4          Max           Argentina        1                2
  5          Sam           Argentina        2                2
  6          Stacy         China            1                4
  7          Ken           China            2                4
  8          jack          China            3                4
  9          Don           China            4                4

したがって、問題は更新にあり、最初の行のみを取得し、それに基づいてすべてのテーブルを更新しています。

各行を反復処理して更新するにはどうすればよいですか?

4

2 に答える 2

0

これを試して:

Update u set
    rank = (select count(*) from users
            where country = u.country 
               and id <= u.Id),
    total = (Select count(*) from users
             where country = u.country)
From users u
于 2013-11-04T17:30:58.500 に答える