LeetCode(178):スコアランキングRank Scores(SQL)

1520 ワード

2020.2.23 LeetCode 0ブラシ個人ノートから整理(更新継続)
github:https://github.com/ChopinXBP/LeetCode-Babel
転送ゲート:スコアランキング
スコアランキングを実現するためにSQLクエリーを作成します.2つのスコアが同じ場合、2つのスコアランキング(Rank)は同じです.平分後の次の順位は次の連続する整数値であることに注意してください.言い換えれば、順位の間に「間隔」があるべきではない.
+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

たとえば、上記のScoresテーブルに基づいて、クエリーを返します(スコアが高いものから低いものまで):
+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

#   1 2 3 4 5 6
SELECT Score,
    ROW_NUMBER() OVER (ORDER BY Score DESC) AS 'Rank'
FROM Scores;

#   1 2 3 3 3 4
SELECT Score,
    DENSE_RANK() OVER (ORDER BY Score DESC) AS 'Rank'
FROM Scores;

#   1 2 3 3 3 6
SELECT Score,
    RANK() OVER (ORDER BY Score DESC) AS 'Rank'
FROM Scores;

#               ,       ,    rank
SELECT a.Score,
    (SELECT COUNT(DISTINCT b.Score)
    FROM Scores b
    WHERE b.Score >= a.Score) AS 'Rank'
FROM Scores a
ORDER BY a.Score DESC;

#       
select  Score,
    ((CASE
    WHEN @prevRank = Score then @curRank
    WHEN @prevRank := Score then @curRank := @curRank + 1
    ELSE @curRank := @curRank +1
    END )*1) AS 'Rank'
FROM Scores,(SELECT @curRank := 0,@prevRank := NULL) p
ORDER BY Score DESC


#Coding 1時間、Copying 1秒.いいねを残してくれてありがとう