中位數(Transact-SQL)

適用於:Microsoft Fabric 中的 SQL 分析端點與 Microsoft Fabric 中的倉庫

該 MEDIAN 函數會回傳非NULL 數字值的精確中位數,即第 50 百分位數。 你可以同時用作聚合函數和視窗(解析)函數:

  • 總體使用量:回傳整個群組的中位數。
  • 視窗使用:回傳每個分割區的中位數,同時保留列級輸出。

Transact-SQL 語法慣例

Syntax

聚合函數語法:

MEDIAN ( numeric_expression )

解析函數語法:

MEDIAN ( numeric_expression ) OVER ( [ <partition_by_clause> ] )

引數

numeric_expression

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

OVER 條款

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

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

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

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

傳回類型

傳回 float(53)。

備註

MEDIAN 計算有序非NULL 輸入值的連續第50百分位數。 對於偶數個輸入值,函數會在兩個中間值之間插值。 結果可能不是輸入列中存在的值。

MEDIAN 等同於 PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY numeric_expression) 彙總使用。 解析型在每個劃分中具有等價的百分位連續語意。

NULL 值會被忽略。 若所有輸入值皆為 NULL,或無列符合資格,則 MEDIAN 返回 NULL。 當 ANSI_WARNINGS 是 ON時,消除 NULL 數值會產生標準的總體警告。

MEDIAN 之所以非確定性,是因為在平行執行路徑中的浮點運算可能會產生些微變化。 如需詳細資訊,請參閱確定性與非確定性函式。

不支援 DISTINCT。 不支援字元、日期、時間和日期時間等表達式。

此功能MEDIAN可在Fabric Data Warehouse及 Fabric 項目的 SQL 分析端點中取得。 這個MEDIAN函式在 SQL Server、Azure SQL Database、Azure SQL 受控執行個體 或 Fabric 的 SQL 資料庫中都不被支援。

應用案例

當平均值可能被異常高或低的數值扭曲時使用 MEDIAN 。 例如,中位訂單價值、回應時間或理賠金額通常比算術平均更清楚地代表典型觀察。 彙總形式用來總結群組,分析形式則在每個細節列中加入一個劃分基準。

Examples

答: 計算一個總體中位數

此範例回傳八個值的中位數值。 由於輸入列數為偶數,插 MEDIAN 值介於4到5列之間。

SELECT MEDIAN(value) AS MedianValue
FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8)) AS t(value);

結果為 4.5。

B. 計算每個群組的中位數

此範例計算每個銷售區域的中位訂單金額。

WITH SalesOrders AS (
    SELECT *
    FROM (VALUES
        ('North', 120.00),
        ('North', 220.00),
        ('North', 320.00),
        ('South', 150.00),
        ('South', 250.00),
        ('South', 450.00)
    ) AS v(region, order_amount)
)
SELECT
    region,
    MEDIAN(order_amount) AS MedianOrderAmount
FROM SalesOrders
GROUP BY region;

C. 忽略 NULL 值

此範例忽略輸入, NULL 從剩餘值計算中位數。

SELECT MEDIAN(value) AS MedianValue
FROM (VALUES (1), (2), (NULL), (3), (4)) AS t(value);

若每個輸入值皆為 NULL,則函數返回 NULL。

D. 計算分割視窗中位數

此範例將每個服務的中位延遲加到每個請求列。

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,
    MEDIAN(latency_ms) OVER (PARTITION BY service) AS ServiceMedianLatency
FROM ServiceLatency;