分位数(Transact-SQL)

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

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

  • 聚合使用:返回整个群所需的分位数。
  • 窗口使用:返回每个分区请求的分位数,同时保持行级输出。

Transact-SQL 语法约定

Syntax

聚合函数语法:

QUANTILE ( numeric_literal , numeric_expression )

分析函数语法:

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。QUANTILE

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

返回类型

返回 float(53)。

Remarks

QUANTILE 计算对有序非NULL 输入值的连续分位数。 当请求的分位数位于两个值之间时,函数会在它们之间插值。 结果可能不是输入行中存在的值。

的 QUANTILE(p, numeric_expression) 聚合形式等价于 PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY numeric_expression)。 解析形式在每个分区内具有等价的连续百分位语义。

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

对于相同的非NULL 输入值和 numeric_literal,返回 QUANTILE 相同的结果。

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

该QUANTILE功能在 SQL Server、Azure SQL 数据库、Azure SQL 托管实例 或 Fabric 中的 SQL 数据库中都不支持。

用例

用于 QUANTILE 计算四分位数、百分位数及其他精确分布边界,语法简洁。 例如,按计划计算p90理赔金额,按地区计算p95服务延迟,或为业务指标计算Q1、中位数和Q3值。

Examples

A. 计算总分位数

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

WITH Samples AS (
    SELECT *
    FROM (VALUES
        (1), (NULL), (2), (3), (4), (5), (6), (7), (8), (13)
    ) AS v(value)
)
SELECT
    QUANTILE(0.25, value) AS Q1_25thPercentile,
    QUANTILE(0.50, value) AS Median_50thPercentile,
    QUANTILE(0.75, value) AS Q3_75thPercentile,
    QUANTILE(0.95, value) AS P95
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,
    QUANTILE(0.90, claim_amount) AS P90ClaimAmount
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 QUANTILE(0.90, discount_percent) AS P90DiscountPercent
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,
    QUANTILE(0.95, latency_ms) OVER (PARTITION BY service) AS ServiceP95Latency
FROM ServiceLatency;