APPROX_QUANTILE(Transact-SQL)

适用于:Microsoft Fabric 中的 SQL 分析终结点和 Microsoft Fabric 中的仓库

该 APPROX_QUANTILE 函数返回一个近似连续的非NULL 数值分位数。 可以将它用作聚合函数和窗口(分析)函数:

  • 聚合使用:返回整个组的近似分位数。
  • 窗口使用:返回每个分区的近似分位数,同时保持行级输出。

Transact-SQL 语法约定

Syntax

聚合函数语法:

APPROX_QUANTILE ( numeric_literal , numeric_expression )

分析函数语法:

APPROX_QUANTILE ( numeric_literal , numeric_expression ) OVER ( [ <partition_by_clause> ] )

Arguments

numeric_literal

分位数用于估计。 该值必须处于从 0.0 到 1.0的包含范围内。 例如,指定 0.5 估计中位数或 0.95 估算第95百分位数。

numeric_expression

计算其近似分位数的数值表达式。 支持的精确数值类型有 int、 bigint、 smallint、 moneytinyintnumericdecimalsmallmoney和 。 支持的近似数值类型有 float 和 real。

OVER 子句

partition_by_clause将子句生成的FROM结果集划分为分区,并将函数应用于每个分区。

如果你没有指定 partition_by_clause,函数会把查询结果集的所有行当作一个分区。

该OVER子句不支持,ROWS也RANGE不支持ORDER BY。APPROX_QUANTILE

有关详细信息,请参阅 SELECT - OVER 子句(Transact-SQL)。

返回类型

返回 float(53)。

Remarks

APPROX_QUANTILE 估计对有序非NULL 输入值的连续分位数。 需要精确结果时使用 QUANTILE 。

近似结果可能与精确 QUANTILE 结果略有不同,且由于执行计划和并行合并路径的不同,不同执行过程也可能有所不同。 APPROX_QUANTILE 具有不确定性。 有关详细信息,请参阅确定性函数和不确定性函数。

NULL 值将被忽略。 如果所有输入值均为 NULL,或无行符合条件,则 APPROX_QUANTILE 返回 NULL。 当 ANSI_WARNINGS 时 ON,消除 NULL 值产生标准汇总警告。

APPROX_QUANTILE 旨在降低延迟和内存占用,相较于对大型数据集进行精确 QUANTILE 计算。

不支持 DISTINCT。 不支持字符、日期、时间和日期时间表达。

该APPROX_QUANTILE功能可在Fabric Data Warehouse和Fabric项的SQL分析端点中获得。 该APPROX_QUANTILE功能在 SQL Server、Azure SQL 数据库、Azure SQL 托管实例 或 Fabric 中的 SQL 数据库中都不支持。

用例

用于 APPROX_QUANTILE 大型仪表盘、探索性分析和分组报告,前提是精确估计就足够。 例如,估算p90理赔金额、p95服务延迟或p99遥测值,而无需花费精确分位数计算的成本。

Examples

A. 计算总量近似分位数

本例估计了第一四分位数、中位数、第三四分位数和第95百分位数。

WITH Samples AS (
    SELECT *
    FROM (VALUES
        (1), (NULL), (2), (3), (4), (5), (6), (7), (8), (13)
    ) AS v(value)
)
SELECT
    APPROX_QUANTILE(0.25, value) AS ApproxQ1,
    APPROX_QUANTILE(0.50, value) AS ApproxMedian,
    APPROX_QUANTILE(0.75, value) AS ApproxQ3,
    APPROX_QUANTILE(0.95, value) AS ApproxP95
FROM Samples;

B. 计算每个群的近似分位数

本例估算了每个保险计划的第90百分位理赔金额。

WITH Claims AS (
    SELECT *
    FROM (VALUES
        ('Plan-A', 420.00),
        ('Plan-A', 500.00),
        ('Plan-A', 610.00),
        ('Plan-B', 250.00),
        ('Plan-B', 275.00),
        ('Plan-B', 310.00)
    ) AS v(plan_name, claim_amount)
)
SELECT
    plan_name,
    APPROX_QUANTILE(0.90, claim_amount) AS ApproxP90ClaimAmount
FROM Claims
GROUP BY plan_name;

C. 对于全NULL组返回NULL

此示例返回 NULL 是因为所有限定值均为 NULL。

WITH CampaignDiscounts AS (
    SELECT *
    FROM (VALUES
        (9001, NULL),
        (9001, NULL),
        (9001, NULL),
        (9002, 10.00)
    ) AS v(campaign_id, discount_percent)
)
SELECT APPROX_QUANTILE(0.90, discount_percent) AS ApproxP90DiscountPercent
FROM CampaignDiscounts
WHERE campaign_id = 9001;

D. 计算一个分区窗口近似分位数

该示例将每个服务的约95百分位延迟加到每个请求行。

WITH ServiceLatency AS (
    SELECT *
    FROM (VALUES
        ('Checkout', 'req-001', 180),
        ('Checkout', 'req-002', 220),
        ('Checkout', 'req-003', 260),
        ('Search', 'req-010', 90),
        ('Search', 'req-011', 110),
        ('Search', 'req-012', 130)
    ) AS v(service, request_id, latency_ms)
)
SELECT
    service,
    request_id,
    latency_ms,
    APPROX_QUANTILE(0.95, latency_ms) OVER (PARTITION BY service) AS ServiceApproxP95Latency
FROM ServiceLatency;