什么是 RANK() 和 DENSE_RANK()?
在 SQL 中,RANK() 和 DENSE_RANK() 都是用于对结果集进行排序的窗口函数。
它们常用于处理具有相同值(并列)的数据行,并为每行分配一个排名。
核心区别
RANK():当存在并列时,会跳过后续排名。
DENSE_RANK():当存在并列时,不会跳过后续排名。
示例数据
假设我们有以下学生成绩表:
| 学生 | 分数 |
|---|---|
| 张三 | 95 |
| 李四 | 90 |
| 王五 | 90 |
| 赵六 | 85 |
使用 RANK()
SELECT 学生, 分数,
RANK() OVER (ORDER BY 分数 DESC) AS rank_num
FROM 成绩;
结果:
| 学生 | 分数 | rank_num |
|---|---|---|
| 张三 | 95 | 1 |
| 李四 | 90 | 2 |
| 王五 | 90 | 2 |
| 赵六 | 85 | 4 |
注意:由于有两个第2名,下一个排名直接跳到第4名。
使用 DENSE_RANK()
SELECT 学生, 分数,
DENSE_RANK() OVER (ORDER BY 分数 DESC) AS dense_rank_num
FROM 成绩;
结果:
| 学生 | 分数 | dense_rank_num |
|---|---|---|
| 张三 | 95 | 1 |
| 李四 | 90 | 2 |
| 王五 | 90 | 2 |
| 赵六 | 85 | 3 |
注意:即使有两个第2名,下一个排名仍是连续的第3名。
如何选择?
- 需要“真实”排名(如竞赛名次,有并列就跳过)→ 使用
RANK() - 需要连续排名(如分类等级、无跳号需求)→ 使用
DENSE_RANK()