【Mysql】MySQL四大排名函数(MySQL8版本支持)

本文详细介绍了SQL中的四种排名函数:ROW_NUMBER()用于排序并分配唯一顺序号,RANK()处理相同值时保持排名一致,DENSE_RANK()提供连续排名,NTILE()则将数据分发到指定数量的区间。通过实例展示了它们的用法和区别。
摘要由CSDN通过智能技术生成

一、ROW_NUMBER ()

--语法形式:  ROW_NUMBER()  OVER(PARTITION BY COL1 ORDER BY COL2) 
--解释:     根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

举例说明:

select ROW_NUMBER() over(order by id1) odid,* from #t1

image.png

 

select ROW_NUMBER() over(partition by id1 order by id1) odid,* from #t1

image.png

常用的使用场景: 取每个学科的前3名

select * from 

( select subject,name,score,ROW_NUMBER() over(PARTITION by subject order by score desc) as num from #score 

) T where T.num <= 3 order by subject 

结果:

image.png

 二、RANK()

定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里得区分和ROW_NUMBER()不一样的地方,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而使用Rank()时,出现相同成绩时,他们的排名是一样的。

举例说明row_number()和rank()的区别:

image.png

当出现两个学生成绩相同时,ROW_NUMBER()排名不一样,而rank()排名一样。RANK()是 1 2 2,而ROW_NUMBER()则还是1 2 3,这就是RANK()和ROW_NUMBER()的区别了

 此函数也可以使用partition by进行分组

三、DENSE_RANK()

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?看例子:

image.png

DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()。

 此函数也可以使用partition by进行分组

四、NTILE() 

定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。

image.png

 这里查询了3次,第一次分为1个’区’ ,所以查询结果number全是1,第二次分为2个区,查询结果为 1 1 2,意思就是 第一个 ‘区’ 为 1 1 两个编号的数据 ,第二个’区’只有2这个数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值