中央値(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、 smallint、 tinyint、 numeric、 decimal、 bit、 smallmoney、 moneyです。 サポートされている近似数値型は float と realです。

OVER 句

partition_by_clauseでは、FROM句によって生成された結果セットがパーティションに分割され、関数が各パーティションに適用されます。

もし partition_by_clauseを指定しなければ、関数はクエリ結果セットのすべての行を単一のパーティションとして扱います。

OVER条項はMEDIANのORDER BY、ROWS、RANGEを支持していません。

詳細については、「 SELECT - OVER 句 (Transact-SQL)」を参照してください。

戻り値の型

float(53) を返します。

注釈

MEDIAN 順序付けられた非NULL 入力値の連続した50パーセンタイルを計算します。 偶数個の入力値の場合、関数は2つの中間値の間で補間を行います。 結果が入力行に存在しない価値があるかもしれません。

MEDIAN は集計使用において PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY numeric_expression) に相当します。 解析形式は各分割内で同等のパーセンタイル連続意味を持ちます。

NULL 値は無視されます。 すべての入力値がNULL、または条件を満たす行がなければ、MEDIANNULL返します。 ANSI_WARNINGSがONされた場合、NULL値を消去すると標準的な集計警告が表示されます。

MEDIAN は非決定的で、並列実行経路での浮動小数点計算がわずかな変動を生じることがあるためです。 詳細については、「 決定論的関数と非決定的関数」を参照してください。

DISTINCTはサポートされていません。 文字、日付、時間、日付時間の表現はサポートされていません。

MEDIAN関数はFabric Data WarehouseおよびFabricアイテムのSQL分析エンドポイントで利用可能です。 MEDIAN関数はSQL Server、Azure SQL Database、Azure SQL Managed Instance、FabricのSQLデータベースではサポートされていません。

利用シーン

平均値が異常に高く、または低いことで歪む可能性がある場合に使う MEDIAN 。 例えば、中央値注文価値、応答時間、請求金額は、算術平均よりも典型的な観察結果をより明確に表すことが多いです。 集計形式はグループを要約し、解析形式は各詳細行に分割ベンチマークを追加します。

Examples

A. 総中央値を計算します

この例は8つの値の中央値を返します。 入力は偶数行であるため、 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;