摘要:在本教程中,您将学习如何使用 SQL CUME_DIST()
函数计算行中值的累积分布率。
SQL CUME_DIST() 函数简介
CUME_DIST()
是一种窗口函数,其计算值集中值中值的累积分布。
CUME_DIST()
函数返回一个值,用以表示值小于或等于 (<=
) 当前行值的行的数量除以总行数。
N / total_rows
Code language: SQL (Structured Query Language) (sql)
此公式如下:
N
是值小于或等于当前行值的行数。total_rows
是正在评估的分区或结果集中的行数。
CUME_DIST()
函数的返回值范围介于大于 0 的低值和小于或等于 1 的高值之间。
0 < CUME_DIST() <= 1
Code language: SQL (Structured Query Language) (sql)
重复的列值将接收相同的 CUME_DIST()
值。
CUME_DIST()
函数的语法如下:
CUME_DIST() OVER (
PARTITION BY expr1, expr2 ...
ORDER BY expr1 [ASC | DESC], expr2...
)
Code language: SQL (Structured Query Language) (sql)
此语法中:
- 首先,
PARTITION BY
语句将结果集划分为多个分区。如果省略PARTITION BY
语句,函数将整个结果集视为一个分区。 - 然后,
ORDER BY
语句对各个分区中的行进行排序。 - 最后,
CUME_DIST()
函数将独立应用于每个经过排序的分区。
SQL CUME_DIST() 函数示例
请查阅以下来自 样本数据库 的 employees
和 departments
表。

为进行演示,以下语句基于 employees
和 departments
表 创建视图,名为 department_headcounts
CREATE VIEW department_headcounts
AS
SELECT
department_name,
COUNT(employee_id) headcount
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id
GROUP BY
e.department_id;
Code language: SQL (Structured Query Language) (sql)
以下语句按每个部门的人员统计数查找累积分布值
SELECT
department_name,
headcount,
ROUND(
CUME_DIST() OVER (
ORDER BY headcount
)
,2) cume_dist_val
FROM
department_headcounts;
Code language: SQL (Structured Query Language) (sql)
输出内容如下:

在本例中,按人员统计数升序对部门进行排序。结果集中总共有 11 行。
Administration
部门有人员统计数 1。Human Resources
和 Public Relations
的人员统计数也与 Administration 相同。结果,有 3 个部门有人员统计数 1。CUME_DIST()
函数会使用以下公式计算第一行的累积分布值:
3 / 11 = 0.27
Code language: SQL (Structured Query Language) (sql)
相同的逻辑应用于第二行和第三行。
Marketing
部门有人员统计数 2。该函数将查找其他人员统计数小于或等于 2 的部门。结果为 5。因此,CUME_DIST()
的 Marketing
部门的分布值为 5 / 11 = 0.45
与剩余行应用相同的逻辑。
在本教程中,您已学习如何使用 SQL CUME_DIST()
函数计算一组值中的值的累积分布。