原题: 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
这个挺有意思的。