APPROX_QUANTILE(Transact-SQL)

適用対象:Microsoft Fabric の SQL 分析エンドポイントと Microsoft Fabric のウェアハウス

APPROX_QUANTILE関数は、非NULL数値値の近似連続分位数を返します。 集計関数とウィンドウ (分析) 関数の両方として使用できます。

  • 集計使用:グループ全体の要求された近似分位数を返します。
  • ウィンドウ使用:各パーティションに対して行レベルの出力を保持しつつ、要求された近似分位数を返します。

Transact-SQL 構文表記規則

Syntax

集計関数の構文:

APPROX_QUANTILE ( numeric_literal , numeric_expression )

分析関数の構文:

APPROX_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条項はAPPROX_QUANTILEのORDER BY、ROWS、RANGEを支持していません。

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

戻り値の型

float(53) を返します。

注釈

APPROX_QUANTILE 順序付けられた非NULL 入力上の連続分位数を推定します。 正確な結果が必要な場合は QUANTILE を使いましょう。

おおよその結果は正確な QUANTILE 結果と若干異なることがあり、実行計画や並列マージパスの影響で実行ごとに異なることがあります。 APPROX_QUANTILE は非決定的です。 詳細については、「 決定論的関数と非決定的関数」を参照してください。

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

APPROX_QUANTILE これは、大規模なデータセットでの正確な QUANTILE 計算と比較して遅延とメモリ使用量を削減することを目的としています。

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

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

利用シーン

大規模なダッシュボード、探索的分析、そして正確な推定で十分なグループ報告には APPROX_QUANTILE を活用しましょう。 例えば、p90請求額、p95サービスレイテンシ、またはp99テレメトリー値を正確な分位計算のコストなしで推定できます。

Examples

A. 総量近似分位数を計算する

この例は第一四分位、中央値、第三四分位、第95百分位を推定しています。

WITH Samples AS (
    SELECT *
    FROM (VALUES
        (1), (NULL), (2), (3), (4), (5), (6), (7), (8), (13)
    ) AS v(value)
)
SELECT
    APPROX_QUANTILE(0.25, value) AS ApproxQ1,
    APPROX_QUANTILE(0.50, value) AS ApproxMedian,
    APPROX_QUANTILE(0.75, value) AS ApproxQ3,
    APPROX_QUANTILE(0.95, value) AS ApproxP95
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,
    APPROX_QUANTILE(0.90, claim_amount) AS ApproxP90ClaimAmount
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 APPROX_QUANTILE(0.90, discount_percent) AS ApproxP90DiscountPercent
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,
    APPROX_QUANTILE(0.95, latency_ms) OVER (PARTITION BY service) AS ServiceApproxP95Latency
FROM ServiceLatency;