适用于:Microsoft Fabric 中的 SQL 分析终结点和 Microsoft Fabric 中的仓库
该 QUANTILE 函数返回一个精确连续的非NULL 数值分位数。 可以将它用作聚合函数和窗口(分析)函数:
- 聚合使用:返回整个群所需的分位数。
- 窗口使用:返回每个分区请求的分位数,同时保持行级输出。
Syntax
聚合函数语法:
QUANTILE ( numeric_literal , numeric_expression )
分析函数语法:
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。QUANTILE
有关详细信息,请参阅 SELECT - OVER 子句(Transact-SQL)。
返回类型
返回 float(53)。
Remarks
QUANTILE 计算对有序非NULL 输入值的连续分位数。 当请求的分位数位于两个值之间时,函数会在它们之间插值。 结果可能不是输入行中存在的值。
的 QUANTILE(p, numeric_expression) 聚合形式等价于 PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY numeric_expression)。 解析形式在每个分区内具有等价的连续百分位语义。
NULL 值将被忽略。 如果所有输入值均为 NULL,或无行符合条件,则 QUANTILE 返回 NULL。 当 ANSI_WARNINGS 时 ON,消除 NULL 值产生标准汇总警告。
对于相同的非NULL 输入值和 numeric_literal,返回 QUANTILE 相同的结果。
不支持 DISTINCT。 不支持字符、日期、时间和日期时间表达。
该QUANTILE功能在 SQL Server、Azure SQL 数据库、Azure SQL 托管实例 或 Fabric 中的 SQL 数据库中都不支持。
用例
用于 QUANTILE 计算四分位数、百分位数及其他精确分布边界,语法简洁。 例如,按计划计算p90理赔金额,按地区计算p95服务延迟,或为业务指标计算Q1、中位数和Q3值。
Examples
A. 计算总分位数
本例计算了第一四分位数、中位数、第三四分位数和第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;