标签:dense 函数 TOP 并列 rank SQL 名次 图解 over
力扣178题 分数排名问题
题目:
如果两个分数相同,则两个分数排名(Rank)相同,平分后的下一个名次应该是下一个连续的整数值值。换句话说,名次之间不应该有“间隔”。
id | salary |
1 | 100 |
2 | 89 |
3 | 84 |
4 | 89 |
5 | 68 |
根据推断:所得到的值应该是
id | salary | rank |
1 | 100 | 1 |
2 | 89 | 2 |
4 | 89 | 2 |
3 | 84 | 3 |
5 | 68 | 4 |
【解题思路】
1、涉及到排名问题,可以使用窗口函数 [Mysql > 8的版本才支持此函数,mysql5.6不支持]
2、窗口函数是什么???有什么区别 ??
{ 拓展知识点 }
通过例子得出结论
emplyee表
id | salary |
1 | 98 |
2 | 100 |
3 | 83 |
4 | 98 |
5 | 60 |
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 | salary | row_number | dense_rank | rank |
2 | 100 | 1 | 1 | 1 |
1 | 98 | 2 | 2 | 2 |
4 | 98 | 3 | 2 | 2 |
3 | 83 | 4 | 3 | 4 |
5 | 60 | 5 | 4 | 5 |
通过具体的例子发现结论:
窗口函数之序号函数
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的问题
标签:dense,函数,TOP,并列,rank,SQL,名次,图解,over 来源: https://blog.csdn.net/DevotedQi/article/details/119213468
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。