SQL Server排名函数大比拼:RANK、DENSE_RANK、ROW_NUMBER、NTILE详解
在数据库开发中,排名需求无处不在——学生成绩排名、销售业绩排行、商品销量榜……SQL Server 2005引入了四个强大的排名函数,让这些需求变得异常简单。
今天我们就用一个实例,彻底搞懂这四个函数的区别和用法。
首先创建一个订单表,包含订单ID和数量:
create table rankorder( orderid int, qty int)go-- 插入测试数据insert rankorder values(30,10)insert rankorder values(10,10)insert rankorder values(80,10)insert rankorder values(40,10)insert rankorder values(30,15)insert rankorder values(30,20)insert rankorder values(22,20)insert rankorder values(21,20)insert rankorder values(10,30)insert rankorder values(30,30)insert rankorder values(40,40)go
SELECT orderid, qty, ROW_NUMBER() OVER(ORDER BY qty) AS rownumber, RANK() OVER(ORDER BY qty) AS [rank], DENSE_RANK() OVER(ORDER BY qty) AS denserank, NTILE(3) OVER(ORDER BY qty) AS [NTILE]FROM rankorderORDER BY qty
执行结果:
通过这个结果,我们可以清晰地看到四个函数的区别:
特点:按顺序编号,连续且不并列
场景:需要唯一序号时,如分页查询
qty=10的有4条记录,分别获得1、2、3、4号,没有并列
特点:相同值并列,但排名会跳号
场景:体育比赛排名(有并列时跳过名次)
qty=10的4条记录并列第1,下一条qty=15直接跳到第5名
特点:相同值并列,排名连续不跳号
场景:等级评定、连续排名需求
qty=10的4条记录并列第1,qty=15排第2,qty=20排第3
特点:将数据尽量平均分成指定组数,连续且并列
场景:数据分桶、百分位分析
NTILE(3)将11条数据分成3组:4条(组1)、4条(组2)、3条(组3)
如果加上PARTITION BY,可以在每个分组内独立排名:
SELECT orderid, qty, DENSE_RANK() OVER(ORDER BY qty) AS a, -- 全局排名 DENSE_RANK() OVER(PARTITION BY orderid ORDER BY qty) AS b -- 按orderid分区排名FROM rankorderORDER BY qty
部分结果:
可以看到:
a列:在整个结果集上排名
b列:按orderid分区(10,21,22,30,40,80)后,在每个分区内独立排名
这四个排名函数各有特色,掌握它们的区别能让你的SQL功力更上一层楼。记住那个对比表,遇到排名需求时就能快速选择最合适的函数。
阅读原文:原文链接