管理杂谈OA答疑ERP答疑教程搜索

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(3OVER(ORDER BY qty) AS [NTILE]FROM rankorderORDER BY qty

执行结果:

orderid
qty
rownumber
rank
denserank
NTILE
30
10
1
1
1
1
10
10
2
1
1
1
80
10
3
1
1
1
40
10
4
1
1
1
30
15
5
5
2
2
30
20
6
6
3
2
22
20
7
6
3
2
21
20
8
6
3
2
10
30
9
9
4
3
30
30
10
9
4
3
40
40
11
11
5
3

函数特性对比

通过这个结果,我们可以清晰地看到四个函数的区别:

1. ROW_NUMBER() - 最纯粹的行号

2. RANK() - 跳号排名

3. DENSE_RANK() - 连续排名

4. NTILE() - 分组排名

快速记忆表

函数
排名连续性
是否并列
典型场景
RANK()
不一定连续
有并列
比赛排名、奖学金评定
DENSE_RANK()
连续
有并列
职级晋升、连续等级
ROW_NUMBER()
连续
无并列
分页查询、序号生成
NTILE()
连续
有并列
数据分桶、百分位

进阶玩法:分区排名

如果加上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

部分结果:

orderid
qty
a
b

10
10
1
1

30
10
1
1

40
10
1
1

30
15
2
2

30
20
3
3

21
20
3
1
← orderid=21的第一条记录,所以在分区内排第1

可以看到:

写在最后

这四个排名函数各有特色,掌握它们的区别能让你的SQL功力更上一层楼。记住那个对比表,遇到排名需求时就能快速选择最合适的函数。

阅读原文:原文链接


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn