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,以便進行分數判斷和排名計算。

 1SELECT
 2    Score,
 3    CAST(Rank AS SIGNED) as Rank
 4FROM (
 5    SELECT
 6        Score,
 7        @rank := IF(@score=Score, @rank, @rank + 1) as Rank,
 8        @score := Score
 9    FROM
10        Scores s,
11        (SELECT @score := null, @rank := 0) t
12    ORDER BY
13        Score DESC
14) t

原題

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