贝利信息

SQL 如何统计中位数与百分位?

日期:2026-01-26 00:00 / 作者:舞夢輝影
PostgreSQL用percentile_cont可直接计算中位数和任意百分位,需配合WITHIN GROUP(ORDER BY...),自动插值且忽略NULL;MySQL 8.0+需窗口函数模拟,SQL Server必须作为窗口函数使用,旧版数据库需退化方案。

PostgreSQL 用 percentile_cont 直接算中位数和任意百分位

PostgreSQL 原生支持连续分布的百分位计算,percentile_cont 是最稳妥的选择。它会插值(比如两个中间值取平均),结果符合统计学定义的中位数。

MySQL 8.0+ 需用窗口函数模拟,没有内置 percentile_cont

MySQL 不提供直接的百分位聚合函数,得靠 ROW_NUMBER() 和总行数推算位置,再用条件聚合取值。逻辑清晰但容易写错边界。

SQL Server 的 PERCENTILE_CONT 和兼容性陷阱

SQL Server 2012+ 支持 PERCENTILE_CONT,语法和 PostgreSQL 几乎一致,但有关键区别:它**必须作为窗口函数使用**,不能直接用于聚合上下文。

跨数据库通用

方案:用子查询 + LIMIT/OFFSET(仅限近似中位数)

当无法用窗口函数或插值函数时(比如旧版 MySQL、SQLite),可退而求其次用排序后取中间位置,但只适用于中位数,且不插值、不处理偶数情况,误差可能达一个量级。

实际用的时候,先确认数据库版本和函数可用性,再决定走原生函数还是手动模拟;插值与否影响结果精度,业务敏感场景(比如风控阈值、报表指标)必须明确是否允许插值,不能默认“差不多就行”。