引言
在SQL中,RANK() 和 DENSE_RANK() 是两种常用的窗口函数,用于对数据进行排名。
虽然它们看起来相似,但在处理相同值(并列)时的行为有明显差异。
正确理解两者的区别,有助于在数据分析、报表生成等场景中做出合适的选择。
核心区别
| 函数 | 并列处理方式 | 是否跳过后续排名 |
|---|---|---|
RANK() |
相同值获得相同排名 | 是(例如:1,1,3) |
DENSE_RANK() |
相同值获得相同排名 | 否(例如:1,1,2) |
示例说明
假设有以下学生成绩表:
+----------+--------+ | 姓名 | 分数 | +----------+--------+ | 张三 | 95 | | 李四 | 95 | | 王五 | 90 | | 赵六 | 85 | +----------+--------+
使用 RANK():
SELECT 姓名, 分数,
RANK() OVER (ORDER BY 分数 DESC) AS 排名
FROM 成绩;
-- 结果:
-- 张三, 95, 1
-- 李四, 95, 1
-- 王五, 90, 3 ← 跳过了第2名
-- 赵六, 85, 4
使用 DENSE_RANK():
SELECT 姓名, 分数,
DENSE_RANK() OVER (ORDER BY 分数 DESC) AS 排名
FROM 成绩;
-- 结果:
-- 张三, 95, 1
-- 李四, 95, 1
-- 王五, 90, 2 ← 未跳过
-- 赵六, 85, 3
适用场景
- RANK():适用于需要体现“空缺排名”的场景,如竞赛中因并列导致的名次空缺。
- DENSE_RANK():适用于连续排名需求,如排行榜、绩效等级划分等。