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更能反映真实中心趋势 - 数据均匀分布:
avg和median均可 - 需要任意百分位(如 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真题
