【sql 】—SQLServer 中的排名函数
⼩编在项⽬中经常⽤到Row_Number()函数,它是sql server 2012 出现的四⼤排名函数(排名函数为分区中的每⼀⾏返回⼀个排名值)之⼀,下⾯为⼤家介绍⼀下它的⽤法。
使⽤到的表原始数据 (SELECT ROW_NUMBER() OVER (ORDER BY PK)AS Number ,PK,OrderID,BOPID,StepQueue FROM
dbo.PLM_BOP_PPR WHERE OrderID = ‘100000003921-03’)
1、Row_Number()
返回结果集分区内⾏的序列号,每个分区的第⼀⾏从1开始,也需要专门⼀列⽤于存放排序后的编号。
语法⽰例
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
-- 根据PK 的顺序为当前表中记录产⽣⼀个顺序列
SELECT ROW_NUMBER() OVER (ORDER BY PK)AS Number ,PK,OrderID,BOPID,StepQueue FROM dbo.PLM_BOP_PPR WHERE OrderID = '100000003
适⽤情况 : web分页查询显⽰⾏号、⼀些需要排序信息的应⽤中。
2、Rank()
Rank函数⽤于返回结果集的分区内每⾏的排名, ⾏的排名是相关⾏之前的排名数加⼀。与Row_Nmber()函数类似,不同的是Rank()是
跳跃排序。
Rank函数考虑到了over⼦句中排序字段值相同的情况,如果使⽤rank函数来⽣成序号,over⼦句中排序字段值相同的序号是⼀样的,
后⾯不同的字段的序号将跳过相同的序号排下⼀个,具体看例⼦吧。
语法
RANK ( ) OVER ( [ partition_by_clause ]order_by_clause )
⽰例
-- 按照 BOPID 来进⾏排名
-- BOPID 相同的数据排名是⼀样的,后⾯的排名根据当前的记录数以此类推
SELECT RANK()OVER (ORDER BY BOPID)AS Rank ,PK,OrderID,BOPID,StepQueue FROM dbo.PLM_BOP_PPR WHERE OrderID = '100000003921-03'
3、Dense_Rank()
dense_rank函数的功能与rank函数类似,rank函数在⽣成序列号时是跳跃的,⽽dense_rank函数是连续的。也就是说,当遇到相同排
名时,将紧接着下⼀次的排名值增加。
语法
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
⽰例
SELECT DENSE_RANK()OVER (ORDER BY BOPID)AS Rank ,PK,OrderID,BOPID,StepQueue FROM dbo.PLM_BOP_PPR WHERE OrderID = '100000003
⼀点⼩想法:Rank()函数和Dense_Rank()函数可以⽤考试时的例⼦来理解,考试结束后,如果⼏个同学考的分数⼀样⾼⽼师发奖状的时候
会给他们发⼀样名次的奖状,A、B、C同学并列第⼀名,再低⼀点的分数是第⼆名、第三名,这便是Dense_Rank()的体现;但是在那全班
同学的成绩单上往往会根据学⽣姓名排名,即使分数⼀样,也会显⽰1、2、3名,成绩第⼆名的同学在成绩单上就体现为第四名,这便是
Rank()函数的体现。
rank函数的用法4、Ntile()
将有序分区中的⾏分发到指定数⽬的组中。 各个组有编号,编号从⼀开始。 对于每⼀个⾏,NTILE 将返回此⾏所属的组的编号。
语法
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
integer_expression --指定组数
⽰例
SELECT NTILE(3) OVER (ORDER BY BOPID)AS Ntile ,PK,OrderID,BOPID,StepQueue FROM dbo.PLM_BOP_PPR WHERE OrderID = '100000003921-03'
分了3组,17 = 6 + 6 + 5
【分组约定】
1、每组的记录数不能⼤于它上⼀组的记录数,即编号⼩的组放的记录数不能⼩于编号⼤的组。也就是说,第1组中的记录数只能⼤于等于第2组及以后各组中的记录数。
2、所有组中的记录数要么都相同,要么从某⼀个记录较少的组(命名为X)开始后⾯所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,⽽第四组的记录数是8,那么第五组和第六组的记录数也必须是8。
使⽤排名函数注意事项
排名函数必须有包含 ORDER BY 的 OVER ⼦句
分组内从1开始排序
在使⽤over等函数时,over⾥头的分组及排序的执⾏晚于“where,group by,order by”的执⾏
总结
个⼈觉得排名函数中⽤的⽐较多的是Row_Number函数,当然了不同业务场景下还是要选适合的,今天的排名函数先介绍到这,期待下次再会~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论