Medium之178.分数排名
问题
编写一个 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 |
重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 ‘Rank’
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rank-scores
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
法一:开窗函数
select score,
dense_rank() over(order by score desc) as 'Rank'
from scores
一、开窗函数语法
开窗函数 over([partition by 要分区的列名] order by 要排序的列名) as ‘新的列名’
二、排名函数:
1.Row_number()
:排名连续 不重复,即使遇到表中的两个一样的数值亦是如此,即1,2,3,4
2.rank()
:相同数值,排名一样,但是下一个排名值是实际的序位数,即1,2,2,4
3.dense_rank()
:相同数值,排名一样,但是下一个排名是紧接着上一个排名位数继续,即1,2,2,3
法二:直接思维
select s1.score,count(distinct s2.score) as 'Rank'
from scores s1
inner join scores s2
on s1.score <= s2.score
group by s1.id
order by s1.score desc
用group by 是因为需要对每个数据进行排名,没有的话,只显示最小值的一条结果。
还没有评论,来说两句吧...