SQL 如何用 PERCENTILE_CONT / PERCENTILE_DISC 计算精确中位数-SQL

PERCENTILE_CONT 和 PERCENTILE_DISC 的核心区别在哪

二者都用于计算分位数,但中位数(50% 分位)结果可能不同:PERCENTILE_CONT 线性插值,返回连续分布下的理论值;PERCENTILE_DISC 直接取排序后存在的实际值(向下取整逻辑),不插值。

比如数据 [1, 3, 5, 7]:
– PERCENTILE_CONT(0.5) 插值得到 4.0(3 和 5 中间)
– PERCENTILE_DISC(0.5) 返回 3(第 2 个值,即 floor((n+1)/2) = 2)

  • 当需要严格等于原始数据中的某个值(如报表要求“真实出现过的中位销售额”),用 PERCENTILE_DISC
  • 当需数学上更平滑的中心趋势(如统计建模输入),用 PERCENTILE_CONT
  • 空值默认被忽略,但若列含大量 NULL,实际参与计算的行数会减少,结果易偏移

语法写错会导致直接报错或静默错误

常见硬伤:漏掉 WITHIN GROUP、括号位置错、ORDER BY 缺失。PostgreSQL / SQL Server / Oracle 都强制要求该结构,MySQL 不支持这两个函数(8.0+ 仅支持 PERCENT_RANK 等替代方案)。

正确写法长这样:

SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY sales_amount) AS median_cont,
       PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY sales_amount) AS median_disc
FROM orders;
  • PERCENTILE_CONT 和 PERCENTILE_DISC 是聚合函数,不能出现在 WHERE 或 GROUP BY 中,只能在 SELECT 或 HAVING(配合 GROUP BY)里用
  • WITHIN GROUP 括号内必须是单列 ORDER BY,不支持表达式如 ORDER BY ABS(price)(部分数据库报错)
  • 参数必须是 0 到 1 的常量小数,不能是列名或子查询(如 PERCENTILE_CONT(pct_col) 会失败)

按组算中位数时容易漏掉 PARTITION BY

想算每个部门的中位薪资?别只加 GROUP BY dept——那会把整个函数当普通聚合用,报错或结果错乱。必须用窗口函数写法,靠 OVER + PARTITION BY。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » SQL 如何用 PERCENTILE_CONT / PERCENTILE_DISC 计算精确中位数-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4021809+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4021810+
  • 本周更新: 0+
  • 最后更新: 2026-03-16