MySQL排名函数
应用场景:
编写一个 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/
如上题,可以通过新版本MySQL(8.0+)提供的DENSE_RANK()
排名函数实现。
SELECT SCORE, DENSE_RANK() OVER(ORDER BY SCORE DESC) AS `RANK` FROM SCORES;
关于排名函数:
- RANK:并列跳跃排名,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,跳跃到总共的排名。
- DENSE_RANK:并列连续排序,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,依然按照连续数字排名。
- ROW_NUMBER:连续排名,即使相同的值,依旧按照连续数字进行排名。
这样讲可能有点抽象,我们看下实际使用的效果。
有一张学生分数表,数据如下:
mysql> select * from students;
+----+-------+-------+
| id | name | score |
+----+-------+-------+
| 1 | curry | 100 |
| 2 | klay | 99 |
| 3 | KD | 100 |
| 4 | green | 90 |
| 5 | James | 99 |
| 6 | AD | 96 |
+----+-------+-------+
根据三种不同的方法排序,SQL如下:
select id, name, rank() over(order by score desc) as r,
DENSE_RANK() OVER(order by score desc) as dense_r,
row_number() OVER(order by score desc) as row_r
from students;
结果:
mysql> select id, name, rank() over(order by score desc) as r,
-> DENSE_RANK() OVER(order by score desc) as dense_r,
-> row_number() OVER(order by score desc) as row_r
-> from students;
+----+-------+---+---------+-------+
| id | name | r | dense_r | row_r |
+----+-------+---+---------+-------+
| 1 | curry | 1 | 1 | 1 |
| 3 | KD | 1 | 1 | 2 |
| 2 | klay | 3 | 2 | 3 |
| 5 | James | 3 | 2 | 4 |
| 6 | AD | 5 | 3 | 5 |
| 4 | green | 6 | 4 | 6 |
+----+-------+---+---------+-------+
6 rows in set (0.00 sec)
怎么样,是不是一目了然呢?
参考博客:
本文作者:漆原Blog
本文链接:https://www.cnblogs.com/7moon/p/14210663.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步