APPROX_PERCENTILE_CONT (Transact-SQL)

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

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

Transact-SQL 语法约定

语法

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

参数

numeric_literal

要计算的百分位数。 该值必须介于 0.0 和 1.0 之间。

order_by_expression

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

返回类型

float(53)

备注

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

近似百分位函数使用 KLL 草图。 草图通过读取数据流生成。 由于使用的算法,与其非近似对应函数 (PERCENTILE_CONT) 相比,此函数所需的内存更少。

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

已知行为

  • 函数的输出在所有执行中可能都不相同。 用于这些函数的算法是 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_CONT(0.10) WITHIN GROUP(ORDER BY Salary) AS 'P10',
APPROX_PERCENTILE_CONT(0.90) WITHIN GROUP(ORDER BY Salary) AS 'P90'
FROM tblEmployee
GROUP BY DeptId;