LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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(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() - 最纯粹的行号

  • 特点:按顺序编号,连续且不并列

  • 场景:需要唯一序号时,如分页查询

  • qty=10的有4条记录,分别获得1、2、3、4号,没有并列

2. RANK() - 跳号排名

  • 特点:相同值并列,但排名会跳号

  • 场景:体育比赛排名(有并列时跳过名次)

  • qty=10的4条记录并列第1,下一条qty=15直接跳到第5名

3. DENSE_RANK() - 连续排名

  • 特点:相同值并列,排名连续不跳号

  • 场景:等级评定、连续排名需求

  • qty=10的4条记录并列第1,qty=15排第2,qty=20排第3

4. NTILE() - 分组排名

  • 特点:将数据尽量平均分成指定组数,连续且并列

  • 场景:数据分桶、百分位分析

  • NTILE(3)将11条数据分成3组:4条(组1)、4条(组2)、3条(组3)

快速记忆表

函数
排名连续性
是否并列
典型场景
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

可以看到:

  • a列:在整个结果集上排名

  • b列:按orderid分区(10,21,22,30,40,80)后,在每个分区内独立排名

写在最后

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


阅读原文:原文链接


该文章在 2026/4/15 18:08:05 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号