原題: https://leetcode-cn.com/problems/rank-scores/
解題目錄
編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(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.第一種解法
這道題,如果知道dense_rank(),就很簡單;不知道的話,就有點難了。(mySql沒有dense_rank(),oracle和hive有)
select
score as Score,
dense_rank() over(order by score desc) as Rank
from scores;
這吐槽一下,不知道爲啥,別名有問題:
2. 第二種解法
然後說一下mysql如何解題,也就是不用dense_rank()的方法:
select
s1.score Score,
(select
count(distinct(s2.score))
from scores s2
where s2.score >= s1.score
) as Rank
from scores s1
order by Rank
這個挺有意思的。