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

一、ROW_NUMBER ()

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

举例说明:

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

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

常用的使用场景: 取每个学科的前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 

结果:

 二、RANK()

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

 

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

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

三、DENSE_RANK()

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

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

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

四、NTILE() 

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

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

posted @ 2022-03-16 10:34  Arbitrary233  阅读(2886)  评论(0编辑  收藏  举报