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