MySQL CUME_DIST函数

时间:2019-11-20 08:52:27  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL CUME_DIST()函数来计算累积分布值。

MySQL CUME_DIST()函数概述

CUME_DIST()是一个窗口函数,它返回值在一组值中的累积分布。
它表示值小于或等于该行值的行数除以总行数。

CUME_DIST()函数的返回值大于零且小于或等于1(0 <CUME_DIST()<= 1)。
重复的列值接收相同的CUME_DIST()值。

下面显示了CUME_DIST()函数的语法:

CUME_DIST() OVER (
	PARTITION BY expr, ...
	ORDER BY expr [ASC | DESC], ...
)

在这种语法中,PARTITION BY子句将FROM子句返回的结果集划分为CUME_DIST()函数适用的分区。

ORDER BY子句指定每个分区或整个结果集中各行的逻辑顺序,以防省略PARTITION BY。
CUME_DIST()函数根据行在分区中的顺序来计算每行的累积分布值。

CUME_DIST()函数的近似公式如下:

ROW_NUMBER() / total_rows

MySQL CUME_DIST()函数示例

让我们创建一个名为scores的表,其中包含一些用于演示的示例数据:

CREATE TABLE scores (
    name VARCHAR(20) PRIMARY KEY,
    score INT NOT NULL
);

INSERT INTO
	scores(name, score)
VALUES
	('Smith',81),
	('Jones',55),
	('Williams',55),
	('Taylor',62),
	('Brown',62),
	('Davies',84),
	('Evans',87),
	('Wilson',72),
	('Thomas',72),
	('Johnson',100);

以下语句在结果集中找到分数的累积分布:

SELECT
	name,
    score,
    ROW_NUMBER() OVER (ORDER BY score) row_num,
    CUME_DIST() OVER (ORDER BY score) cume_dist_val
FROM
	scores;

这是输出:

在此示例中,分数按从55到100的升序排序。
请注意,已添加ROW_NUMBER()函数以供参考。

那么CUME_DIST()函数如何执行计算呢?

对于第一行,该函数查找结果集中的行数,其值小于或等于55。
结果为2。
然后CUME_DIST()函数将2除以总行数,即10:2 / 10。
结果是0.2或20%。
相同的逻辑应用于第二行。

对于第三行,该函数查找值小于或等于62的行数。
共有四行。
然后,CUME_DIST()函数的结果为:4/10 = 0.4,即40%。

相同的计算逻辑将应用于其余行。

在本教程中,您学习了如何使用MySQL CUME_DIST()函数来计算一组值中值的累积分布。