SQL百分位
哪两个常见的词关系如此密切,以至于你认为它们是一样的?对于我们数据库开发人员来说,它将是SQL数据库和统计数据。
甚至在数据库管理中也会出现一个常见的统计计算,那就是百分位数。
百分位数是一种统计度量,它允许我们将数据集分成相等的部分。百分位数的作用是提供对数据分布的洞察,这是我们如何理解值是如何分布的。
在本教程中,我们将学习如何在SQL中计算百分位数以将数据划分为不同的段。
样表
让我们首先设置一个基本表,其中包含用于演示的示例数据。这有助于我们说明计算百分位数的各种方法的行为和结果输出。
让我们创建一个名为“products”的表,其中包含杂货信息。“create table”子句如下:
创建表
INT主键AUTO_INCREMENT;
product_name VARCHAR (255),
类别VARCHAR (255),
price DECIMAL(10,2),
量INT,
expiration_date日期,
条形码长整型数字
);
一旦创建了表,就可以继续将示例数据添加到表中。我们可以使用下面的“insert”语句:
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
值('厨师帽25cm',
“面包房”,
24.67,
57岁的
“2023-09-09”,
2854509564204);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“鹌鹑蛋罐头”、
“储藏室”,
17.99,
67年,
“2023-09-29”,
1708039594250);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“咖啡-蛋诺卡布奇诺”,
“面包房”,
92.53,
10,
“2023-09-22”,
8704051853058);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值('梨-多刺',
“面包房”,
65.29,
48,
“2023-08-23”,
5174927442238);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“意面-天使的头发”,
“储藏室”,
48.38,
59岁的
“2023-08-05”,
8008123704782);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值('Wine - Prosecco Valdobiaddene');
“生产”,
44.18,
3,
“2023-03-13”,
6470981735653);
最后,您应该得到如下表:
SQL百分位
可以猜到,计算百分位数的方法可能因数据库引擎的不同而不同。然而,最常用的方法是使用PERCENTILE_DISC()和PERCENTILE_CONT()函数。
这些函数是标准SQL规范(2003)的一部分。因此,PostgreSQL和Oracle都支持它。
PERCENTILE_CONT ()
让我们从PERCENTILE_CONT()函数开始。这个函数允许我们计算百分位数值作为数据集的一部分。
该函数返回插值值,该值可能不精确到数据集中的特定数据点。
函数语法如下:
perentile_cont(百分位)WITHIN GROUP (ORDER BY column_name) OVER ();
该函数接受以下参数:
- 百分位数-指定所需的百分位数值(0.0到1.0)。
- column_name—表示我们希望计算百分位数的列。
- OVER() -它设置窗口函数来指定整个数据集。
使用该函数的示例如下:
选择
百分位数(0.5)在组内(按价格订购)除以()为中位数
从
产品;
注意:这个查询只适用于PostgreSQL,因为MySQL不支持使用WITHIN GROUP。
这将计算所提供数据的第50个百分位数。
PERCENTILE_DISC ()
我们可以使用PERCENTILE_DISC()函数直接从数据集中计算作为离散值的百分位数值。
该函数返回一个对应于实际数据点的值。
函数语法如下(PostgreSQL):
perentile_disc (perentile) WITHIN GROUP (ORDER BY column_name) OVER ();
使用示例输出如下:
选择
在GROUP (ORDER BY price) OVER()中,作为百分位数
从
产品;
这应该计算数据的第25个百分位数。
结论
本教程介绍了如何使用各种函数来计算SQL数据库中的百分位数。