【问题标题】:Resort the rank after updating it更新后的排名
【发布时间】:2020-01-15 06:17:45
【问题描述】:

有一个学生表,上面有他们的分数:

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。

我更新了他们的分数,但如何提升他们的排名?

【问题讨论】:

  • 您可以删除rank 列并在每次选择时即时构建它。
  • 表里的数据其实很多,有办法只用select吗?如果我必须更新超过 2 个分数怎么办?
  • @user618520 - “如果我必须更新超过 2 个分数怎么办?”即使您更改 100 个学生分数或 1 个学生分数,以下答案中此处提供的 UPDATE 语句和 SELECT 语句也可以正确选择和更新。

标签: sql sql-server rank


【解决方案1】:

一种更简单的方法是不存储排名,而是在需要时动态查询它:

SELECT studentid, studentscore, RANK() OVER (ORDER BY studentscore)
FROM   mytable

【讨论】:

  • 你好,我们还有一种没有分数的表,只有studentid和rank,更新rank后如何排序?谢谢
【解决方案2】:

正如@Mureinik 指出的那样,您可以即时生成排名。但是,如果您需要存储它(可能出于性能原因),您可以使用具有新排名的 CTE 更新表:

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

【讨论】:

    【解决方案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”。

    【讨论】:

    • @user618520 您可以使用此 UPDATE 来解决您在 cmets 中提出的问题:“您好,我们有另一种没有分数的表,它们只有学生 ID 和排名,更新后如何对它们进行排名他们的队伍?谢谢”。你有没有检查过我在这里提供的答案和DEMO?
    • @user618520 为什么我输了? :)
    • 我明白了,我只是想知道为什么这个选择的答案比我的好?您已选择我的正确然后更改。为什么?另外,请注意,如果您愿意,您可以给所有人投票,并且您只能选择一个正确答案。
    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多