LeetCode 数据库面试题 – 分数排名(Rank Scores)

编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

IdScore
13.50
23.65
34.00
43.85
54.00
63.65

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

ScoreRank
4.001
4.001
3.852
 3.653
3.653
3.504

分析

据题意,我们可以按 score 降序处理,然后进行以下判断即可:

  • 分数相同,排名不变
  • 分数不同,排名 +1

解答

这里引入两个变量 @score, @rank 用来分别存储上一条记录的 score 和 rank,以便进行分数判断和排名计算。

SELECT
    Score,
    CAST(Rank AS SIGNED) as Rank
FROM (
    SELECT
        Score,
        @rank := IF(@score=Score, @rank, @rank + 1) as Rank,
        @score := Score
    FROM
        Scores s,
        (SELECT @score := null, @rank := 0) t
    ORDER BY
        Score DESC
) t

原题

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rank-scores