1、题目
下图是"班级"表中的内容,记录了每个学生所在班级,和对应的成绩。
现在需要按成绩来排名,如果两个分数相同,那么排名要是并列的。
正常排名是1,2,3,4,但是现在前3名是并列的名次,排名结果是:1,1,1,2。
2、解题思路
1.涉及到排名问题,可以使用窗口函数
2.专用窗口函数rank, dense_rank, row_number有什么区别呢?
它们的区别我举个例子,你们一下就能看懂:
select *,
rank() over (order by 成绩 desc) as ranking,
dense_rank() over (order by 成绩 desc) as dese_rank,
row_number() over (order by 成绩 desc) as row_num
from 班级表
得到的结果:
从上面的结果可以看出:
(1)rank函数:这个例子中是5位,5位,5位,8位,也就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。
(2)dense_rank函数:这个例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。
(3)row_number函数:这个例子中是5位,6位,7位,8位,也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。
根据题目要求的排名规则,这里我们使用dense_rank函数。所以,最终的sql语句是:
select *,
dense_rank() over (order by 成绩 desc) as dese_rank
from 班级
3、本题考点
1.考察如何使用窗口函数
2.专用窗口函数排名的区别:rank, dense_rank, row_number
4、举一反三
涉及到排名的问题,都可以使用窗口函数来解决。记住rank, dense_rank, row_number排名的区别。
注意,mysql版本8已支持窗口函数这个功能,虽然在leetcode上运行不成功,可能的原因是后台的mysql数据库版本不是最新的。