图解SQL语句:经典排名问题+TOP N

本文介绍了如何使用SQL窗口函数解决分数排名问题,重点讨论了row_number()、dense_rank()和rank()的区别。在力扣178题中,dense_rank()函数因能保持连续排名而最适合题目需求。示例展示了在有并列排名时,这三个函数的不同行为,并提供了使用dense_rank()的SQL解决方案。
摘要由CSDN通过智能技术生成

力扣178题     分数排名问题

题目:

如果两个分数相同,则两个分数排名(Rank)相同,平分后的下一个名次应该是下一个连续的整数值值。换句话说,名次之间不应该有“间隔”。

idsalary
1100
289
384
489
568

根据推断:所得到的值应该是

idsalaryrank
11001
2892
4892
3843
5684

【解题思路】

1、涉及到排名问题,可以使用窗口函数 [Mysql > 8的版本才支持此函数,mysql5.6不支持]

2、窗口函数是什么???有什么区别 ??

{ 拓展知识点 }

通过例子得出结论

emplyee表

idsalary
198
2100
383
498
560

  sql语句:

select   *,
	row_number() over(order by salary desc) as `row_number`,
	dense_rank() over(order by salary desc) as `dense_rank`,
	rank() over(order by salary desc) as `rank`,
from emplyee

 运行sql语句得到的结果:

id       salaryrow_numberdense_rankrank
2100111
198222
498322
383434
560545

通过具体的例子发现结论:

窗口函数之序号函数

1、row_number():排序:1,2,3,4,5

行号,列数的意思;想想每一行都是唯一的,即使值相同,也不会出现重复的值

2、dense_rank(): 排序:1,1,2,3,4

密集的,等级的意思;也就是如果有并列的,那接下来的还是会按照顺序来排名次;

比如一个班级有并列第二的两位,那班级就没有第三了吗??并列的第二是第二,剩下的还是按照顺序排列;

3、rank(): 排序:1,2,2,4,5

如果有并列的名次,会占用下一次名次的位置;

比如班级排座位,有两位并列第二的,那肯定是两位第二先选择位置,再让第三名的选;

窗口函数太多类了,我们就先简单了解一下这题用到的几个序号函数;

具体的窗口函数详解请移步下篇内容

【本题结果】

回归题目本身,题目明确要求名次之间不应该有“隔离”,并列后的也应该按照顺序继续排列……

发现dense_rank()序号函数是最符合我们题目本身的意思的

最后的sql语句就是

select *,dense_rank() over(order by salary desc) as `Rank` from emplyee

 

so……,这种方案当然可以解决TOP N的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值