適用於:Microsoft Fabric 中的 SQL 分析端點與 Microsoft Fabric 中的倉庫
該 APPROX_QUANTILE 函數回傳一個近似連續的非NULL 數值分位數。 你可以同時用作聚合函數和視窗(解析)函數:
- 總體使用量:回傳整個群組的近似分位數。
- 視窗使用:回傳每個分割的近似分位數,同時保留列級輸出。
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 估計中位數或 0.95 第95百分位數。
numeric_expression
計算其近似分位數的數值表達式。 支援的精確數值類型包括 int、 bigint、 decimalmoneysmallinttinyintnumericsmallmoney和 。 支援的近似數值類型有 float 和 real。
OVER 條款
partition_by_clause將子句產生FROM的結果集劃分為多個區塊,並對每個區塊套用函數。
如果你沒指定 partition_by_clause,函式會把查詢結果集的所有列當作一個分割區。
該OVER子句不支持 ORDER BY、 ROWS或 RANGE 。APPROX_QUANTILE
欲了解更多資訊,請參閱 SELECT - OVER 條款(Transact-SQL)。
傳回類型
傳回 float(53)。
備註
APPROX_QUANTILE 估計對有序非NULL 輸入值的連續分位數。 當你需要精確結果時,請使用 QUANTILE 。
近似結果可能與精確 QUANTILE 結果略有差異,且因執行計畫與平行合併路徑而不同執行。
APPROX_QUANTILE 是不確定的。 如需詳細資訊,請參閱確定性與非確定性函式。
NULL 值會被忽略。 若所有輸入值皆為 NULL,或無列符合資格,則 APPROX_QUANTILE 返回 NULL。 當 ANSI_WARNINGS 是 ON時,消除 NULL 數值會產生標準的總體警告。
APPROX_QUANTILE 旨在降低延遲與記憶體使用量,相較於對大型資料集進行精確 QUANTILE 計算。
不支援 DISTINCT。 不支援字元、日期、時間和日期時間等表達式。
此功能APPROX_QUANTILE可在Fabric Data Warehouse及 Fabric 項目的 SQL 分析端點中取得。 這個APPROX_QUANTILE函式在 SQL Server、Azure SQL Database、Azure SQL 受控執行個體 或 Fabric 的 SQL 資料庫中都不被支援。
應用案例
用於 APPROX_QUANTILE 大型儀表板、探索性分析,以及在精確估計就足夠時的群組報告。 例如,估算 p90 理賠金額、p95 服務延遲或 p99 遙測值,而無需花費精確分位數計算。
Examples
答: 計算總體近似分位數
此範例估計第一四分位數、中位數、第三四分位數及第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;