適用対象:Microsoft Fabric の SQL 分析エンドポイントと Microsoft Fabric のウェアハウス
QUANTILE関数は非NULL数値の正確な連続分位数を返します。 集計関数とウィンドウ (分析) 関数の両方として使用できます。
- 集計使用:グループ全体の要求された分位数を返します。
- ウィンドウ使用:各パーティションに対して要求された分位数を返しつつ、行レベルの出力を保持します。
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;