跳到主要内容

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_NUMBERRANKDENSE_RANK
张三95111
李四95211
王五90332
赵六85443

五、常见坑点

坑1:什么时候用 RANK 而不是 DENSE_RANK?

如果业务需求是"取前3名",用 RANK 可能只返回2个人(因为第1名并列了2人,第2名被跳过,第3名可能不在结果中)。用 DENSE_RANK 则保证至少3个不同分数段的人。

六、面试怎么考

  • "RANK 和 DENSE_RANK 的区别是什么?" → 必考题
  • "学生成绩排名,并列分数怎么处理?" → RANK
  • "为什么我取前3名只返回了2个人?" → 因为用了 RANK,第一名并列

七、相关面试题

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看