SQL CUME_DIST

摘要:在本教程中,您将学习如何使用 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() 函数示例

请查阅以下来自 样本数据库employeesdepartments 表。

Employees & Departments Tables

为进行演示,以下语句基于 employeesdepartments创建视图,名为 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)

输出内容如下:

SQL CUME_DIST Function Example

在本例中,按人员统计数升序对部门进行排序。结果集中总共有 11 行。

Administration 部门有人员统计数 1。Human ResourcesPublic 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() 函数计算一组值中的值的累积分布。

本教程对您有帮助吗?