如何通过MEDIAN函数在SQL中计算分组数据的中位数?

2026-05-07 12:180阅读0评论SEO教程
  • 内容介绍
  • 相关推荐

本文共计1240个文字,预计阅读时间需要5分钟。

如何通过MEDIAN函数在SQL中计算分组数据的中位数?

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分钟。

如何通过MEDIAN函数在SQL中计算分组数据的中位数?

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)。

阅读全文