CUME_DIST 窗口函数详解
一、一句话理解
CUME_DIST() 计算"小于等于当前值的行数占总行数的比例",范围 (0, 1]。公式:小于等于当前行的行数 / 总行数。
二、函数语法
CUME_DIST() OVER (PARTITION BY 分组列 ORDER BY 排序列)
三、真实业务场景
场景:用户消费金额的累积分布
"消费 500 元在全部用户中处于什么水平?"
SELECT user_id, amount,
ROUND(CUME_DIST() OVER (ORDER BY amount) * 100, 1) AS cume_pct
FROM user_spending;
示例:5 个用户消费 100,200,200,300,500
+---------+--------+----------+
| user_id | amount | cume_pct |
+---------+--------+----------+
| 1 | 100 | 20% | ← 20% 的用户消费 ≤ 100
| 2 | 200 | 60% | ← 60% 的用户消费 ≤ 200(有并列)
| 3 | 200 | 60% |
| 4 | 300 | 80% |
| 5 | 500 | 100% | ← 100% 的用户消费 ≤ 500
+---------+--------+----------+
消费 300 元的用户处于 80% 分位——80% 的人都比你花得少。
四、与 PERCENT_RANK 的关键区别
同一个数据,CUME_DIST 总是 >= PERCENT_RANK(因为 CUME_DIST 把当前行算进了分子)。
| 函数 | 适用场景 |
|---|---|
| PERCENT_RANK | "我超过了百分之多少的人" |
| CUME_DIST | "百分之多少的人在我以下或与我相同" |
五、面试怎么考
- "怎么算累积分布?" → CUME_DIST
- "CUME_DIST 和 PERCENT_RANK 的公式区别?" → 分子不同
- "怎么找中位数?" → CUME_DIST >= 0.5 的第一行
七、相关面试题
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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