PERCENT_RANK 窗口函数详解
一、一句话理解
PERCENT_RANK() 计算当前行在分组中的相对百分比位置,值范围 0 到 1。公式:(当前行排名 - 1) / (总行数 - 1)。
二、函数语法
PERCENT_RANK() OVER (PARTITION BY 分组列 ORDER BY 排序列)
三、真实业务场景
场景:学生的成绩处于班级前百分之多少
SELECT class, student, score,
ROUND(PERCENT_RANK() OVER (PARTITION BY class ORDER BY score DESC) * 100, 1) AS top_pct
FROM scores;
示例:5 个学生,成绩 95,90,85,80,70
+-------+-------+------+
| score | rank | top_pct |
+-------+-------+------+
| 95 | 1 | 0% | ← 最高分,超过 0% 的人
| 90 | 2 | 25% | ← 超过 25% 的人
| 85 | 3 | 50% | ← 中位数
| 80 | 4 | 75% |
| 70 | 5 | 100% | ← 最低分,超过 100% 的人
+-------+-------+------+
PERCENT_RANK=0.5 表示"刚好排在中位数位置"。
四、与 CUME_DIST 的关键区别
| PERCENT_RANK | CUME_DIST | |
|---|---|---|
| 公式 | (rank-1) / (n-1) | 小于等于当前值的行数 / n |
| 最小值 | 0 | >0 |
| 最大值 | 1 | 1 |
同一个 5 人成绩单,score=90(第2名):PERCENT_RANK=0.25,CUME_DIST=0.4(因为有2人得分>=90)。CUME_DIST 总是 >= PERCENT_RANK。
五、面试怎么考
- "怎么算成绩在班级的前百分之多少?" → PERCENT_RANK
- "PERCENT_RANK 和 CUME_DIST 的区别?" → 公式不同,CUME_DIST 把并列值都算进去
七、相关面试题
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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