适用于: SQL Server 2022 (16.x)
Azure SQL 数据库
Azure SQL Managed Instance
SQL Analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
此函数根据提供的百分位数和排序规范从组中某一组值返回值。 由于这是一个近似函数,因此输出将在基于等级的误差边界内,并具有一定置信度。 由于此近似百分位数基于列值的离散分布,因此输出值将等于列中的特定值之一。 对于大型数据集,此函数可用作 PERCENTILE_DISC 的替代方法,与响应时间较慢的准确百分位值相比,可以接受可忽略的错误和较快的响应。
语法
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