如何通过MEDIAN函数在SQL中计算分组数据的中位数?
- 内容介绍
- 相关推荐
本文共计1240个文字,预计阅读时间需要5分钟。
MySQL 8.0.33 开始原生支持 `MEDIAN()` 窗口函数,但仅限于窗口模式(不能直接在 `GROUP BY` 中使用),并且必须配合 `OVER()` 使用。常见错误是将 `SELECT MEDIAN(score) FROM t GROUP BY class` 写成这样,会导致错误 `ERROR 1111 (HY000): Invalid use of group function`。
正确做法是先用窗口函数为每组排序编号,再取中间位置的值;或者改用 MEDIAN() OVER (PARTITION BY class ORDER BY score),但注意:它返回的是「累积中位数」(cumulative median),不是每组独立中位数。
-
MEDIAN()在 MySQL 中不接受DISTINCT,也不能嵌套在聚合上下文中 - 若数据量大,
MEDIAN() OVER (...)可能比手动模拟慢,因需全组排序 - 空值(
NULL)会被自动过滤,不影响中位数计算逻辑
PostgreSQL 怎么安全地用 PERCENTILE_CONT(0.5) 替代 MEDIAN()
PostgreSQL 没有 MEDIAN() 函数,但 PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY x) 是标准、可靠、支持分组的替代方案。它在 GROUP BY 中可直接使用,语义清晰,且对偶数个元素自动插值(如 [1,3] → 2.0)。
本文共计1240个文字,预计阅读时间需要5分钟。
MySQL 8.0.33 开始原生支持 `MEDIAN()` 窗口函数,但仅限于窗口模式(不能直接在 `GROUP BY` 中使用),并且必须配合 `OVER()` 使用。常见错误是将 `SELECT MEDIAN(score) FROM t GROUP BY class` 写成这样,会导致错误 `ERROR 1111 (HY000): Invalid use of group function`。
正确做法是先用窗口函数为每组排序编号,再取中间位置的值;或者改用 MEDIAN() OVER (PARTITION BY class ORDER BY score),但注意:它返回的是「累积中位数」(cumulative median),不是每组独立中位数。
-
MEDIAN()在 MySQL 中不接受DISTINCT,也不能嵌套在聚合上下文中 - 若数据量大,
MEDIAN() OVER (...)可能比手动模拟慢,因需全组排序 - 空值(
NULL)会被自动过滤,不影响中位数计算逻辑
PostgreSQL 怎么安全地用 PERCENTILE_CONT(0.5) 替代 MEDIAN()
PostgreSQL 没有 MEDIAN() 函数,但 PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY x) 是标准、可靠、支持分组的替代方案。它在 GROUP BY 中可直接使用,语义清晰,且对偶数个元素自动插值(如 [1,3] → 2.0)。

