分位數(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> ] )

引數

numeric_literal

計算分位數。 該值必須在從 0.0 到 1.0的包含範圍內。 例如,指定 0.5 計算中位數或 0.95 第95百分位數。

numeric_expression

計算分位數的數值表達式。 支援的精確數值類型包括 int、 bigint、 decimalmoneysmallinttinyintnumericsmallmoney和 。 支援的近似數值類型有 float 和 real。

OVER 條款

partition_by_clause將子句產生FROM的結果集劃分為多個區塊,並對每個區塊套用函數。

如果你沒指定 partition_by_clause,函式會把查詢結果集的所有列當作一個分割區。

該OVER子句不支持 ORDER BY、 ROWS或 RANGE 。QUANTILE

欲了解更多資訊,請參閱 SELECT - OVER 條款(Transact-SQL)。

傳回類型

傳回 float(53)。

備註

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 Database、Azure SQL 受控執行個體 或 Fabric 的 SQL 資料庫中都不被支援。

應用案例

用於 QUANTILE 計算四分位數、百分位數及其他精確分布邊界,語法簡潔。 例如,依方案計算 p90 理賠金額、按地區計算 p95 服務延遲,或是商業指標的第 1 季度、中位數與第 3 季度數值。

Examples

答: 計算總分位數

此範例計算第一四分位數、中位數、第三四分位數及第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;