PostgreSQL百万行表中如何根据百分位获取units列对应整数值?
在PostgreSQL中处理含空值列的百分位计算问题
关于当前查询的两个问题解析
- 返回double类型的原因:
PERCENTILE_CONT是连续型百分位函数,它会在数据点之间进行线性插值,结果可能是原数据中不存在的小数,因此返回double precision类型。 - 结果远小于最大值的合理性:如果
units列数据是长尾分布(比如大部分值集中在低位,仅少数极大值),85分位值远小于最大值是完全正常的——85分位代表85%的数据都小于等于这个值,剩下15%的高值不会影响它的计算结果。
得到整数类型的目标百分位值
如果你需要的是原数据中实际存在的整数(比如你例子中的5000),应该使用PERCENTILE_DISC(离散型百分位函数),它会返回数据集中最小的那个值,使得至少指定比例的行小于等于该值。再通过CAST转换为整数类型:
SELECT CAST(PERCENTILE_DISC(0.85) WITHIN GROUP (ORDER BY units) AS INTEGER) AS percentile FROM count WHERE units IS NOT NULL;
验证结果是否正确
要确认计算出的百分位值是否符合预期,可以统计小于等于该值的行数占比,看是否接近85%:
WITH percentile_result AS ( SELECT PERCENTILE_DISC(0.85) WITHIN GROUP (ORDER BY units) AS target_val FROM count WHERE units IS NOT NULL ) SELECT COUNT(*) FILTER (WHERE units <= target_val) * 1.0 / COUNT(*) AS actual_percentile FROM count, percentile_result WHERE units IS NOT NULL;
如果返回的actual_percentile接近0.85,说明结果是正确的。
补充:如果需要连续插值后的整数结果
如果你确实需要PERCENTILE_CONT的插值结果,但要转为整数,可以用ROUND或直接强制转换:
-- 四舍五入取整 SELECT ROUND(PERCENTILE_CONT(0.85) WITHIN GROUP (ORDER BY units))::INTEGER AS percentile FROM count WHERE units IS NOT NULL; -- 直接截断小数取整 SELECT CAST(PERCENTILE_CONT(0.85) WITHIN GROUP (ORDER BY units) AS INTEGER) AS percentile FROM count WHERE units IS NOT NULL;
内容的提问来源于stack exchange,提问作者Firefly
相关产品推荐
相关产品推荐

