更新排名后重新排序
Resort the rank after updating it
有一个学生table,他们的分数是:
studentid studentscore rank
----------------------------------
1 77 6
2 80 4
3 90 2
4 94 1
5 78 5
6 88 3
但是id 1和5的分数是错误的,id 1应该是78,id 5应该是77。
我更新了他们的分数,但是他们的排名怎么算呢?
更简单的方法是不存储排名,而是在需要时动态查询:
SELECT studentid, studentscore, RANK() OVER (ORDER BY studentscore)
FROM mytable
正如@Mureinik 指出的那样,您可以即时生成排名。但是,如果您需要存储它(可能出于性能原因),您可以使用具有新等级的 CTE 更新 table:
WITH ranks AS (
SELECT studentid, RANK() OVER (ORDER BY studentscore DESC) AS [rank]
FROM students
)
UPDATE s
SET s.[rank] = r.[rank]
FROM students s
JOIN ranks r ON s.studentid = r.studentid
更新 studentid
1 和 5 的 studentscore
值后,这是输出:
studentid studentscore rank
1 78 5
2 80 4
3 90 2
4 94 1
5 77 6
6 88 3
这是您可以使用的更新语句:
update students
set rankc = T1.Ranking
from students T2
left join (select RANK() OVER (ORDER BY studentscore desc) as Ranking
, studentid
from students a ) T1
on T1.studentid = T2.studentid
这是DEMO
请注意,对于此示例,我已将您的列 "rank" 重命名为 "rankc"。
有一个学生table,他们的分数是:
studentid studentscore rank
----------------------------------
1 77 6
2 80 4
3 90 2
4 94 1
5 78 5
6 88 3
但是id 1和5的分数是错误的,id 1应该是78,id 5应该是77。
我更新了他们的分数,但是他们的排名怎么算呢?
更简单的方法是不存储排名,而是在需要时动态查询:
SELECT studentid, studentscore, RANK() OVER (ORDER BY studentscore)
FROM mytable
正如@Mureinik 指出的那样,您可以即时生成排名。但是,如果您需要存储它(可能出于性能原因),您可以使用具有新等级的 CTE 更新 table:
WITH ranks AS (
SELECT studentid, RANK() OVER (ORDER BY studentscore DESC) AS [rank]
FROM students
)
UPDATE s
SET s.[rank] = r.[rank]
FROM students s
JOIN ranks r ON s.studentid = r.studentid
更新 studentid
1 和 5 的 studentscore
值后,这是输出:
studentid studentscore rank
1 78 5
2 80 4
3 90 2
4 94 1
5 77 6
6 88 3
这是您可以使用的更新语句:
update students
set rankc = T1.Ranking
from students T2
left join (select RANK() OVER (ORDER BY studentscore desc) as Ranking
, studentid
from students a ) T1
on T1.studentid = T2.studentid
这是DEMO
请注意,对于此示例,我已将您的列 "rank" 重命名为 "rankc"。