分位列(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 、95パーセンタイルを算出するには 0.95 を指定します。

numeric_expression

分位数が計算される数値式。 サポートされる正確な数値タイプは、 int、 bigint、 smallint、 tinyint、 numeric、 decimal、 smallmoney、 moneyです。 サポートされている近似数値型は float と realです。

OVER 句

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

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

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

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

戻り値の型

float(53) を返します。

注釈

QUANTILE 順序付けられた非NULL 入力値に対して連続分位数を計算します。 要求された分位数が2つの値の間に位置すると、関数はそれらを補間します。 結果が入力行に存在しない価値があるかもしれません。

QUANTILE(p, numeric_expression)の総量は PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY numeric_expression) と同等です。 解析形式は各分割内で同等のパーセンタイル連続意味を持ちます。

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

同じ非NULL 入力値と numeric_literalに対して、 QUANTILE は同じ結果を返します。

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

QUANTILE関数はSQL Server、Azure SQL Database、Azure SQL Managed Instance、FabricのSQLデータベースではサポートされていません。

利用シーン

QUANTILEを使って四分位、パーセンタイル、その他の正確な分布境界を簡潔な構文で計算します。 例えば、プランごとのp90請求額、地域ごとのp95サービス遅延、またはビジネス指標のQ1、中央値、Q3の値を計算します。

Examples

A. 集約分位数を計算する

この例は第1四分位、中央値、第3四分位、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;