更新排名后重新排序

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

Demo on dbfiddle

这是您可以使用的更新语句:

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"。