标准SQL大多不支持MEDIAN()需用ROW_NUMBER()与COUNT() OVER()配合手动计算先按组排序编号再根据组内行数取中间位置值平均。中位数计算为什么不能直接用 MEDIAN()因为标准 SQL如 PostgreSQL 9.4 以外、MySQL 8.0 以前、SQL Server 2012压根不提供内置 MEDIAN() 聚合函数即使有如 Oracle、PostgreSQL 9.4 的 PERCENTILE_CONT(0.5)它在分组场景下行为和直觉不符——比如会把整组当作一个连续分布而不是按每组独立算中位数。真正可靠、跨数据库兼容的做法是靠窗口函数 行号逻辑手动定位中间位置。核心思路就一句先排序再找每组的第 N/2 和第 (N/2)1 行N 是组内行数取平均值。ROW_NUMBER() 和 COUNT(*) OVER() 必须配对使用只用 ROW_NUMBER() 不够它只给顺序编号但不知道当前组总共有多少行只用 COUNT(*) OVER(PARTITION BY ...) 也不行它知道总数但不知道哪一行是“中间”。必须两者结合才能判断某行是否落在中位位置上。常见错误是写成 ROW_NUMBER() OVER(ORDER BY x)漏了 PARTITION BY结果全表排一列序完全破坏分组逻辑。正确写法必须带 PARTITION BY group_col 到两个窗口函数里排序字段ORDER BY建议加 NULLS LAST 或显式处理 NULL否则不同数据库对 NULL 排序策略不同中位数可能漂移如果组内行数为奇数中位数就是第 (cnt 1) / 2 行偶数则取第 cnt / 2 和 cnt / 2 1 行的平均值MySQL 8.0 和 PostgreSQL 的写法差异很小但 SQL Server 要绕开 AVG() 隐式转换三者都支持 ROW_NUMBER() 和 COUNT() OVER()语法几乎一致。真正容易踩坑的是数值类型处理 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。