MySQL实现排名函数
本文转自 CSDN
在 MySQL 的新版本 MySQL8.0 已经支持了排名函数 RANK
,DENSE_RANK
和 ROW_NUMBER
. 但是在就得版本中还不支持这些函数 , 只能自己实现 . 实现方法主要用到了条件判断语句(CASE WHEN
或IF
)和添加临时变量 .
排名分类
区别 RANK , DENSE_RANK 和 ROW_NUMBER
- RANK 并列跳跃排名 , 并列即相同值 . 相同的值保留重复名次,遇到下一个不同值时,跳跃到总共的排名
- DENSE_RANK 并列连续排序 . 并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,依然按照连续数字排名
- ROW_NUMBER 连续排名,即使相同的值,依旧按照连续数字进行排名 .
区别如图:
分组排名
将数据分组后排名,区别如图:
准备数据
创建一张分数表,里面有字段:分数score,课程号course_id和学生号student_id。
执行如下SQL语句,进行导入数据。
1 | create table score( |
不分组排名
连续排名
使用ROW_NUMBER
实现:
1 | SELECT score, |
使用变量
实现:
1 | SELECT s.score, (@cur_rank := @cur_rank + 1) ranking |
并列跳跃排名
使用RANK
实现:
1 | SELECT course_id, score, |
使用变量
和IF
语句实现:
1 | SELECT s.score, |
使用变量
和CASE
语句实现:
1 | SELECT s.score, |
并列连续排名
使用DENSE_RANK
实现:
1 | SELECT course_id, score, |
使用变量
和IF
语句实现:
1 | SELECT s.score, |
使用变量
和CASE
语句实现:
1 | SELECT s.score, |
分组排名
分组连续排名
使用ROW_NUMBER
实现:
1 | SELECT course_id, score, |
使用变量
和IF
语句实现:
1 | SELECT s.course_id, s.score, |
分组并列跳跃排名
使用RANK
实现:
1 | SELECT course_id, score, |
使用变量
和IF
语句实现:
1 | SELECT s.course_id, s.score, |
分组并列连续排名
使用DENSE_RANK
实现:
1 | SELECT course_id, score, |
使用变量
和IF
语句实现:
1 | SELECT s.course_id, s.score, |
可以将上述的IF条件提取出来:
1 | SELECT s.course_id, s.score, |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Halcyon Days!