SQL Server排名函数大比拼:RANK、DENSE_RANK、ROW_NUMBER、NTILE详解
|
admin
2026年4月15日 15:3
本文热度 56
|
在数据库开发中,排名需求无处不在——学生成绩排名、销售业绩排行、商品销量榜……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
执行结果:
函数特性对比
通过这个结果,我们可以清晰地看到四个函数的区别:
1. ROW_NUMBER() - 最纯粹的行号
2. RANK() - 跳号排名
3. DENSE_RANK() - 连续排名
4. 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 FROM rankorderORDER BY qty
部分结果:
| | | | |
|---|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | | | ← orderid=21的第一条记录,所以在分区内排第1 |
可以看到:
a列:在整个结果集上排名
b列:按orderid分区(10,21,22,30,40,80)后,在每个分区内独立排名
写在最后
这四个排名函数各有特色,掌握它们的区别能让你的SQL功力更上一层楼。记住那个对比表,遇到排名需求时就能快速选择最合适的函数。
阅读原文:原文链接
该文章在 2026/4/15 18:08:05 编辑过