MEDIAN 开窗函数
计算某个窗口或分区中值的范围的中间值。忽略该范围中的 NULL 值。
MEDIAN 是一种假定连续分布模型的逆分布函数。
语法
MEDIAN ( median_expression ) OVER ( [ PARTITION BY partition_expression ] )
参数
- median_expression
-
一个提供要为其确定中间值的值的表达式(例如列名)。该表达式必须具有数字数据类型或日期时间数据类型或可隐式转换为 1。
- OVER
-
一个指定窗口分区的子句。OVER 子句不能包含窗口排序或窗口框架规范。
- PARTITION BY partition_expression
-
可选。一个设置 OVER 子句中每个组的记录范围的表达式。
数据类型
返回类型由 median_expression 的数据类型确定。下表显示了每种 median_expression 数据类型的返回类型。
输入类型 | 返回类型 |
---|---|
INT2、INT4、INT8、NUMERIC、DECIMAL | DECIMAL |
FLOAT、DOUBLE | DOUBLE |
DATE | DATE |
使用说明
如果 median_expression 参数是使用 38 位最大精度定义的 DECIMAL 数据类型,则 MEDIAN 可能将返回不准确的结果或错误。如果 MEDIAN 函数的返回值超过 38 位,则结果将截断以符合规范,这将导致精度降低。如果在插值期间,中间结果超出最大精度,则会发生数值溢出且函数会返回错误。要避免这些情况,建议使用具有较低精度的数据类型或将 median_expression 参数转换为较低精度。
例如,带 DECIMAL 参数的 SUM 函数返回 38 位的默认精度。结果的小数位数与参数的小数位数相同。因此,例如,DECIMAL(5,2) 列的 SUM 返回 DECIMAL(38,2) 数据类型。
以下示例在 MEDIAN 函数的 median_expression 参数中使用 SUM 函数。PRICEPAID 列的数据类型是 DECIMAL (8,2),因此 SUM 函数返回 DECIMAL(38,2)。
select salesid, sum(pricepaid), median(sum(pricepaid)) over() from sales where salesid < 10 group by salesid;
要避免潜在的精度降低或溢出错误,请将结果转换为具有较低精度的 DECIMAL 数据类型,如以下示例所示。
select salesid, sum(pricepaid), median(sum(pricepaid)::decimal(30,2)) over() from sales where salesid < 10 group by salesid;
示例
以下示例计算每个卖家的平均销售数量:
select sellerid, qty, median(qty) over (partition by sellerid) from winsales order by sellerid; sellerid qty median --------------------------- 1 10 10.0 1 10 10.0 1 30 10.0 2 20 20.0 2 20 20.0 3 10 17.5 3 15 17.5 3 20 17.5 3 30 17.5 4 10 25.0 4 40 25.0
有关 WINSALES 表的说明,请参阅窗口函数示例的示例表。