如何用 APPROX_PERCENTILE / PERCENTILE_CONT 计算近似分位数

发布时间 - 2026-01-30 00:00:00    点击率:
核心区别在于计算方式与适用场景:PERCENTILE_CONT 精确插值但易OOM超时,APPROX_PERCENTILE 基于sketch近似计算,快且省内存但有误差;如查1亿行95分位数,前者可能卡住,后者秒级返回。

APPROX_PERCENTILE 和 PERCENTILE_CONT 的核心区别在哪

简单说:PERCENTILE_CONT 是精确计算(基于排序后插值),APPROX_PERCENTILE 是近似计算(基于采样或 sketch 算法)。前者在大数据量下可能 OOM 或超时,后者快且省内存,但结果有误差范围。

典型场景:查 1 亿行用户停留时长的 95 分位数 —— 用 PERCENTILE_CONT 可能卡住,APPROX_PERCENTILE 几秒返回,误差通常

  • PERCENTILE_CONT 要求输入列可排序,且必须配合 OVER() 或分组使用(如 GROUP BY
  • APPROX_PERCENTILE 多数引擎(Trino、Spark SQL、BigQuery)支持直接聚合,不强制排序,也无 OVER 限制
  • PostgreSQL 只有 PERCENTILE_CONT;ClickHouse 两者都有,但 APPROX_PERCENTILE 对应的是 quantile 系列函数

不同数据库里怎么写才不报错

语法差异极大,抄错一个关键字就失败。重点看三类常见错误:

  • Trino:用 approx_percentile(x, 0.95),不是 approx_percentile(x, 95)(必须是 0~1 小数)
  • BigQuery:用 APPROX_QUANTILES(x, 100)[OFFSET(95)]APPROX_PERCENTILE(x, 0.95)(v1.4+ 支持后者)
  • Spark SQL:approx_percentile(col, 0.95),但注意它不支持多分位数一次算;想同时要 0.5/0.9/0.95,得写三次或改用 approx_quantile
  • PostgreSQL:没有 APPROX_PERCENTILE,强行用会报 function approx_percentile does not exist;只能用 PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY x)

为什么 APPROX_PERCENTILE 有时返回 NULL 或异常值

不是 bug,通常是数据或参数没对齐。常见原因:

  • 输入列为全 NULL:多数引擎返回 NULL,APPROX_PERCENTILE 不做空值过滤,需显式加 WHERE x IS NOT NULL
  • 百分位参数越界:传了 1.2-0.1,Trino 报 percentile must be between 0 and 1,Spark 可能静默转成 0 或 1
  • 内存不足触发降级:Trino 默认 sketch size 是 10k,超大数据倾斜时 sketch 失效,误差飙升甚至返回 null;可调大 approx_percentile.accuracy 配置
  • 类型不匹配:对字符串列用 APPROX_PERCENTILE,报错类似 Unexpected type: varchar —— 它只接受数值型(DOUBLEREALBIGINT

性能差?先检查是否误用了 PERCENTILE_CONT

如果查询跑了几分钟还不出结果,大概率是用了 PERCENTILE_CONT 处理千万级以上数据。它本质是全局排序 + 插值,shuffle 数据量极大。

  • 确认执行计划:Trino 查 EXPLAIN (TYPE DISTRIBUTED),看是否有 Sort + Window 节点;Spark 看 Spark UI 的 Stage 是否出现 long-running SortMergeJoin
  • 临时替换测试:把 PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY x) 换成 APPROX_PERCENTILE(x, 0.95),对比耗时
  • 精度够用就别硬扛:95 分位数误差 ±0.3 秒对业务影响不大,但省下 90% 时间,这种 trade-off 很常见

真正难的是评估误差是否可接受——得拿小样本跑一遍 PERCENTILE_CONTA

PPROX_PERCENTILE 对比,而不是凭感觉。


# 大数据  # app  # ai  # win  # 区别  # 为什么  # sql  # NULL  # sort  # 字符串  # double  # function  # 算法  # spark  # postgresql  # 数据库  # clickhouse  # ui  # bug  # 的是  # 插值  # 报错  # 会报  # 省内  # 可调  # 串列  # 都有  # 不出  # 一遍 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在建站宝盒中设置产品搜索功能?  在centOS 7安装mysql 5.7的详细教程  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel storage目录权限问题_Laravel文件写入权限设置  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何在阿里云服务器自主搭建网站?  SQL查询语句优化的实用方法总结  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  如何挑选优质建站一级代理提升网站排名?  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何实现API版本控制_Laravel版本化API设计方案  Python结构化数据采集_字段抽取解析【教程】  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何用y主机助手快速搭建网站?  如何在自有机房高效搭建专业网站?  使用spring连接及操作mongodb3.0实例  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何获取PHP WAP自助建站系统源码?  Laravel如何处理文件下载请求?(Response示例)  晋江文学城电脑版官网 晋江文学城网页版直接进入  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel如何自定义分页视图?(Pagination示例)  开心动漫网站制作软件下载,十分开心动画为何停播?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何快速打造个性化非模板自助建站?  原生JS获取元素集合的子元素宽度实例  Android滚轮选择时间控件使用详解  如何彻底卸载建站之星软件?  js实现点击每个li节点,都弹出其文本值及修改  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何用好域名打造高点击率的自主建站?  如何在橙子建站中快速调整背景颜色?  如何打造高效商业网站?建站目的决定转化率  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  三星网站视频制作教程下载,三星w23网页如何全屏?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  *服务器网站为何频现安全漏洞?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Swift中switch语句区间和元组模式匹配  Bootstrap CSS布局之列表  JS中对数组元素进行增删改移的方法总结  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程