适用于: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> ] )
Arguments
numeric_literal
分位数用于估计。 该值必须处于从 0.0 到 1.0的包含范围内。 例如,指定 0.5 估计中位数或 0.95 估算第95百分位数。
numeric_expression
计算其近似分位数的数值表达式。 支持的精确数值类型有 int、 bigint、 smallint、 moneytinyintnumericdecimalsmallmoney和 。 支持的近似数值类型有 float 和 real。
OVER 子句
partition_by_clause将子句生成的FROM结果集划分为分区,并将函数应用于每个分区。
如果你没有指定 partition_by_clause,函数会把查询结果集的所有行当作一个分区。
该OVER子句不支持,ROWS也RANGE不支持ORDER BY。APPROX_QUANTILE
有关详细信息,请参阅 SELECT - OVER 子句(Transact-SQL)。
返回类型
返回 float(53)。
Remarks
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 数据库、Azure SQL 托管实例 或 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;