RANK 窗口函数详解
一、一句话理解
RANK() 给每一行排名,值相同的行获得相同排名,但后续排名会跳过——例如 1、1、3、4。
二、函数语法
RANK() OVER (PARTITION BY 分组列 ORDER BY 排序列)
三、真实业务场景
场景:学生成绩排名
各班学生按成绩排名,相同分数并列名次。
| 学生 | 班级 | 成绩 |
|---|---|---|
| 张三 | A班 | 95 |
| 李四 | A班 | 95 |
| 王五 | A班 | 90 |
| 赵六 | A班 | 85 |
SELECT 班级, 学生, 成绩,
RANK() OVER (PARTITION BY 班级 ORDER BY 成绩 DESC) AS 排名
FROM scores;
结果:
A班: 张三 95→第1名, 李四 95→第1名, 王五 90→第3名, 赵六 85→第4名
注意:张三和李四并列第1,所以没有第2名,直接跳到第3名。这是 RANK 的核心特征——并列跳号。
四、与 ROW_NUMBER / DENSE_RANK 的对比
同一份数据,三种函数的区别一目了然:
| 学生 | 成绩 | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|---|
| 张三 | 95 | 1 | 1 | 1 |
| 李四 | 95 | 2 | 1 | 1 |
| 王五 | 90 | 3 | 3 | 2 |
| 赵六 | 85 | 4 | 4 | 3 |
五、常见坑点
坑1:什么时候用 RANK 而不是 DENSE_RANK?
如果业务需求是"取前3名",用 RANK 可能只返回2个人(因为第1名并列了2人,第2名被跳过,第3名可能不在结果中)。用 DENSE_RANK 则保证至少3个不同分数段的人。
六、面试怎么考
- "RANK 和 DENSE_RANK 的区别是什么?" → 必考题
- "学生成绩排名,并列分数怎么处理?" → RANK
- "为什么我取前3名只返回了2个人?" → 因为用了 RANK,第一名并列
七、相关面试题
- 04. 直播间礼物价值Top N观众 — RANK 排名
- 03. 商家评分Top N及变化趋势 — RANK + LAG 环比
- 03. 视频分区热度排名 — RANK 排名实战
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
