1. 窗口函数基础回顾
在深入探讨CUME_DIST()和PERCENT_RANK()之前,我们需要先明确窗口函数的基本概念。窗口函数(Window Function)是SQL中一种强大的分析工具,它能够在保留原始行数据的同时,对一组相关的行进行计算。与聚合函数不同,窗口函数不会将多行合并为单行结果。
窗口函数的核心语法结构包含三个关键部分:
code复制<窗口函数> OVER (
[PARTITION BY <列清单>]
[ORDER BY <排序用列清单>]
[ROWS BETWEEN <起始行> AND <结束行>]
)
其中PARTITION BY子句定义了窗口的分区,ORDER BY决定了窗口内的排序方式,而ROWS BETWEEN则限定了窗口的框架范围。在实际业务场景中,窗口函数常用于解决以下类型的问题:
- 计算移动平均值
- 累计求和
- 排名和分位数计算
- 前后行比较分析
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CUME_DIST()函数深度解析
2.1 数学定义与计算原理
CUME_DIST()函数的正式数学定义为:对于给定的行xᵢ,其累积分布值等于数据集中小于或等于xᵢ的值的数量除以数据集的总行数。用公式表示为:
CUME_DIST(xᵢ) = count(xⱼ | xⱼ ≤ xᵢ) / n
其中:
- xⱼ表示数据集中的任意值
- n表示数据集的总行数
- count()函数计算满足条件的行数
这个函数的计算结果范围在(0,1]之间,最小值大于0,最大值为1。例如,在一个包含100行的数据集中,如果某行的值是最小的,那么它的CUME_DIST值为0.01(1/100);如果是最大的,则为1。
2.2 实际应用案例
假设我们有一个销售数据表sales_data,包含以下字段:sale_id, product_id, sale_amount, sale_date。我们想分析不同产品的销售额分布情况:
sql复制SELECT
product_id,
sale_amount,
CUME_DIST() OVER (PARTITION BY product_id ORDER BY sale_amount) AS cumulative_dist
FROM
sales_data
WHERE
sale_date BETWEEN '2023-01-01' AND '2023-12-31';
这个查询会返回每个产品在2023年的每笔销售额,以及该销售额在该产品所有销售额中的累积分布位置。例如,如果某笔销售额的cumulative_dist值为0.75,意味着该产品的75%的销售额都小于或等于这个值。
2.3 使用场景与业务价值
CUME_DIST()在业
