APPROX_PERCENTILE_DISC (Transact-SQL)

适用于:SQL Server 2022 (16.x)Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

此函数根据提供的百分位数和排序规范从组中某一组值返回值。 由于这是一个近似函数,因此输出将在基于等级的误差边界内,并具有一定置信度。 由于此近似百分位数基于列值的离散分布,因此输出值将等于列中的特定值之一。 对于大型数据集,此函数可用作 PERCENTILE_DISC 的替代方法,与响应时间较慢的准确百分位值相比,可以接受可忽略的错误和较快的响应。

Transact-SQL 语法约定

语法

APPROX_PERCENTILE_DISC (numeric_literal)  
WITHIN GROUP (ORDER BY order_by_expression [ASC|DESC])

参数

numeric_literal

要计算的百分位数。 该值必须介于 0.0 和 1.0 之间。 若要计算第 10 个百分位,传递的值将为 0.10。

order_by_expression

指定要排序的一系列值,并计算百分位数。 默认的排序顺序为升序 (ASC)。  仅允许数值数据类型。 表达式必须计算得出支持的精确或近似数值类型,并且不允许使用其他数据类型。 支持的精确数字类型为 int、bigint、smallint、tinyint、bit、smallmoney 和 money。 支持的近似数值类型是 float 和 real。 不支持 decimal 和 float 数据类型。

返回类型

返回类型由 order_by_expression 类型决定 。

备注

数据集中的任何 null 都将被忽略。

近似百分位函数使用 KLL 草图。 草图通过读取数据流生成。

此函数提供基于排名的错误保证,而不是基于值。 此函数实现可保证最多 1.33% 的错误率,概率在 99% 内。

已知行为

  • 在所有执行中,函数的输出可能不相同。 用于这些函数的算法是 KLL 草图,这是一种随机算法。 每次生成草图时,都会选取随机值。 这些函数提供基于排名的错误保证,而不是基于值。

  • 函数实现可保证最多 1.33% 的错误边界,置信度在 99% 内。

兼容性支持

在兼容级别 110 和更高级别中,WITHIN GROUP 是保留关键字。 有关详细信息,请参阅 ALTER DATABASE 兼容性级别 (Transact-SQL)

示例

以下示例创建一个表,对其进行填充并运行示例查询。

SET NOCOUNT ON
GO
DROP TABLE IF EXISTS tblEmployee
GO
CREATE TABLE tblEmployee (
EmplId INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
DeptId INT,
Salary int);
GO
INSERT INTO tblEmployee
VALUES (1, 31),(1, 33), (1, 18), (2, 25),(2, 35),(2, 10), (2, 10),(3,1), (3,NULL), (4,NULL), (4,NULL)
GO
SELECT DeptId,
APPROX_PERCENTILE_DISC(0.10) WITHIN GROUP(ORDER BY Salary) AS 'P10',
APPROX_PERCENTILE_DISC(0.90) WITHIN GROUP(ORDER BY Salary) AS 'P90'
FROM tblEmployee
GROUP BY DeptId