APPROX_MEDIAN(Transact-SQL)

适用于:Microsoft Fabric 中的 SQL 分析终结点和 Microsoft Fabric 中的仓库

该 APPROX_MEDIAN 函数返回的非数值值的约中位数或第50百分位NULL 数。 可以将它用作聚合函数和窗口(分析)函数:

  • 总用量:返回整个组的近似中位数。
  • 窗口使用:返回每个分区的近似中位数,同时保持行级输出。

Transact-SQL 语法约定

Syntax

聚合函数语法:

APPROX_MEDIAN ( numeric_expression )

分析函数语法:

APPROX_MEDIAN ( numeric_expression ) OVER ( [ <partition_by_clause> ] )

Arguments

numeric_expression

计算其近似中位数的数值表达式。 支持的精确数值类型有 int、 bigint、 smallint、 moneytinyintnumericdecimalsmallmoney和 。 支持的近似数值类型有 float 和 real。

OVER 子句

partition_by_clause将子句生成的FROM结果集划分为分区,并将函数应用于每个分区。

如果你没有指定 partition_by_clause,函数会把查询结果集的所有行当作一个分区。

该OVER子句不支持,ROWS也RANGE不支持ORDER BY。APPROX_MEDIAN

有关详细信息,请参阅 SELECT - OVER 子句(Transact-SQL)。

返回类型

返回 float(53)。

Remarks

APPROX_MEDIAN 估计有序非NULL 输入值的连续第50百分位数。 需要精确结果时使用 中位数 。

近似结果可能与精确 MEDIAN 结果略有不同,且由于执行计划和并行合并路径的不同,不同执行过程也可能有所不同。 APPROX_MEDIAN 具有不确定性。 有关详细信息,请参阅确定性函数和不确定性函数。

NULL 值将被忽略。 如果所有输入值均为 NULL,或无行符合条件,则 APPROX_MEDIAN 返回 NULL。 当 ANSI_WARNINGS 时 ON,消除 NULL 值产生标准汇总警告。

APPROX_MEDIAN 旨在降低延迟和内存占用,相较于对大型数据集进行精确 MEDIAN 计算。

不支持 DISTINCT。 不支持字符、日期、时间和日期时间表达。

该APPROX_MEDIAN功能可在Fabric Data Warehouse和Fabric项的SQL分析端点中获得。 该APPROX_MEDIAN功能在 SQL Server、Azure SQL 数据库、Azure SQL 托管实例 或 Fabric 中的 SQL 数据库中都不支持。

用例

用于 APPROX_MEDIAN 大型仪表盘、探索性分析和分组报告,当精确估计足够且查询性能比精确中位数更重要时。 常见的例子包括近似中位数订单值、服务延迟和遥测测量。

Examples

A. 计算一个总体近似中位数

这个例子估计了八个数值的中位数。

SELECT APPROX_MEDIAN(value) AS ApproxMedianValue
FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8)) AS t(value);

结果接近的 4.5中位数,但可以略有变化。

B. 计算每个组的近似中位数

本例估算了每个销售区域的中位订单金额。

WITH SalesOrders AS (
    SELECT *
    FROM (VALUES
        ('North', 120.00),
        ('North', 220.00),
        ('North', 320.00),
        ('South', 150.00),
        ('South', 250.00),
        ('South', 450.00)
    ) AS v(region, order_amount)
)
SELECT
    region,
    APPROX_MEDIAN(order_amount) AS ApproxMedianOrderAmount
FROM SalesOrders
GROUP BY region;

C. 忽略NULL值

本例在估计中位数时忽略 NULL 了数值。

SELECT APPROX_MEDIAN(value) AS ApproxMedianValue
FROM (VALUES (1), (2), (NULL), (3), (4)) AS t(value);

如果每个输入值都是 NULL,函数返回 NULL。

D. 计算一个分区窗口近似中位数

该示例将每个请求行的每个服务的近似中位延迟相加。

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_MEDIAN(latency_ms) OVER (PARTITION BY service) AS ServiceApproxMedianLatency
FROM ServiceLatency;