如何用 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—— 它只接受数值型(DOUBLE、REAL、BIGINT)
性能差?先检查是否误用了 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_CONT 和 A 对比,而不是凭感觉。
# 大数据
# 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插件使用教程

