次のような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
ただし、rank
とtotal
はすべて最初の 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
したがって、問題は更新にあり、最初の行のみを取得し、それに基づいてすべてのテーブルを更新しています。
各行を反復処理して更新するにはどうすればよいですか?