一、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这个数据。