导读:本期聚焦于小伙伴创作的《SQL怎么用窗口函数计算组内中位数_MEDIAN与PERCENTILE用法详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL怎么用窗口函数计算组内中位数_MEDIAN与PERCENTILE用法详解》有用,将其分享出去将是对创作者最好的鼓励。

在业务报表里,我们常常需要计算每个部门、每个地区或者每个品类下的中位数指标。和平均值不同,中位数对极端值不敏感,更能反映典型水平。借助现代数据库支持的窗口函数,可以直接在组内排序并定位中位数位置,避免繁琐的子查询和自连接。

SQL怎么用窗口函数计算组内中位数_MEDIAN与PERCENTILE用法详解

一、什么是组内中位数

组内中位数是指在一个分组内部,将数据按大小排序后处于中间位置的数值。如果组内记录数为奇数,中位数就是正中间那条记录;如果是偶数,通常取中间两条记录的平均值。

二、使用MEDIAN窗口函数

Oracle等数据库直接提供了MEDIAN窗口函数,它可以作为聚合或分析函数使用。下面以员工表emp为例,按部门deptno计算薪资中位数:

SELECT
  deptno,
  ename,
  sal,
  MEDIAN(sal) OVER (PARTITION BY deptno) AS dept_median_sal
FROM emp;

上述语句中,PARTITION BY deptno表示按部门分组,MEDIAN(sal) OVER(...)会为同一部门的每一行都返回该部门的薪资中位数。

三、使用PERCENTILE_CONT计算中位数

在标准SQL中更通用的是PERCENTILE_CONT,它属于逆分布函数。传入参数0.5即表示取第50百分位数,也就是中位数。PostgreSQL和Oracle均支持该写法:

SELECT
  deptno,
  ename,
  sal,
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY sal)
    OVER (PARTITION BY deptno) AS dept_median_sal
FROM emp;

这里WITHIN GROUP (ORDER BY sal)指定了排序字段,0.5代表中位数位置。

四、MySQL中的近似处理

MySQL在8.0之前没有原生MEDIAN窗口函数,但可以利用ROW_NUMBER与计数配合实现。以下示例展示一种常见写法:

WITH ranked AS (
  SELECT
    deptno,
    sal,
    ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal) AS rn,
    COUNT(*) OVER (PARTITION BY deptno) AS cnt
  FROM emp
)
SELECT
  deptno,
  AVG(sal) AS dept_median_sal
FROM ranked
WHERE rn IN (FLOOR((cnt + 1)/2), CEIL((cnt + 1)/2))
GROUP BY deptno;

该查询先为组内数据编号,再取中间一个或两个位置求平均,从而得到中位数。

五、方法对比

数据库推荐函数说明
OracleMEDIAN / PERCENTILE_CONT原生支持,语法简洁
PostgreSQLPERCENTILE_CONT遵循SQL标准
MySQLROW_NUMBER模拟低版本需手动计算

六、小结

使用窗口函数计算组内中位数,核心在于理解分区与排序。如果数据库支持MEDIANPERCENTILE_CONT,应尽量使用它们以保证性能和可读性;不支持时再用行号模拟。掌握这些写法能让你在面对分组统计需求时更加从容。

SQL窗口函数MEDIAN修改时间:2026-07-26 02:24:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。