跳到主要内容

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真题

交流微信二维码

你可能还想看