跳到主要内容

median:计算中位数

速查结论

median(col) 是 Spark SQL 中用于计算数值或 interval 类型中位数的聚合函数。与 percentile(col, 0.5) 不同,median 语义更直观,专为中位数场景设计。

语法

median(col)

参数说明

参数说明
col数值类型或 ANSI interval 类型的列

返回值:col 的中位数。对于偶数行,返回中间两个值的平均值。

Since: 3.4.0

示例

数值中位数

-- 基础用法
SELECT median(col) FROM VALUES (0), (10) AS tab(col);
-- 结果: 5.0

Interval 中位数

-- interval 类型的中位数
SELECT median(col) FROM VALUES (INTERVAL '0' MONTH), (INTERVAL '10' MONTH) AS tab(col);
-- 结果: 0-5

分组计算中位数

-- 按部门计算工资中位数
SELECT
dept_id,
median(salary) AS median_salary
FROM employees
GROUP BY dept_id;

median vs percentile vs avg 对比

函数返回值抗异常值适用场景
median(col)中位数数据分布偏斜、有极端值
percentile(col, 0.5)与 median 等价需要任意百分位
avg(col)平均值数据均匀分布
-- median vs avg:异常值场景对比
WITH data AS (SELECT col FROM VALUES (10), (20), (30), (10000) AS tab(col))

SELECT
median(col) AS median_val,
avg(col) AS avg_val
FROM data;
-- median_val: 25.0(不受极端值影响)
-- avg_val: 2515.0(被极端值严重拉高)

选型建议

  • 数据有极端值(如收入、房价):用 median,比 avg 更能反映真实中心趋势
  • 数据均匀分布:avgmedian 均可
  • 需要任意百分位(如 P95、P99):用 percentile

常见报错与避坑指南

不支持的类型

median 仅支持数值类型和 ANSI interval 类型,其他类型(如字符串、日期)会报错。

-- 错误写法:字符串类型不支持
SELECT median(name) FROM users;
-- AnalysisException: cannot resolve ...

-- 正确写法:确保列是数值类型
SELECT median(age) FROM users;

与 percentile 的选择

median 是 percentile(col, 0.5) 的语法糖,但可读性更好。

-- 等价写法
SELECT median(salary) FROM employees;
SELECT percentile(salary, 0.5) FROM employees;
📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看