PostgreSQL百分位函数处理负数的反向分位数计算问题
解决负温度反向分位数查询问题
核心问题在于你需要基于**温度从高到低(降序)**计算分位数,而默认的ORDER BY是升序排列,导致分位数计算方向和需求完全相反。
错误原因分析
你的原始查询使用默认升序排序,对于-1到-10的温度数据,升序排列后顺序是-10, -9, ..., -1。此时PERCENTILE_CONT(0.25)计算的是这个序列的25%位置值(即-7.5),也就是你所说的“实际第三四分位数”,和你需要的反向逻辑完全不符。
正确查询语句
调整排序方向为降序,同时匹配你对“最小值/最大值”的反向定义,完整查询如下:
SELECT MAX("temperature") AS 最小值, PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY "temperature" DESC) AS 第一四分位数, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY "temperature" DESC) AS 中位数, PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY "temperature" DESC) AS 第三四分位数, MIN("temperature") AS 最大值 FROM "city_temperatures";
关键说明
- 排序方向修改:
ORDER BY "temperature" DESC让数据按-1, -2, ..., -10排列,分位数计算完全贴合你需要的反向逻辑。 - 极值字段对应:你期望的“最小值”是温度最高的-1,对应SQL的
MAX();期望的“最大值”是温度最低的-10,对应SQL的MIN()。 - 分位数计算验证:针对10条示例数据,降序排列后:
- 第一四分位数(0.25)对应第2.5个位置,取
-2和-3的平均值得到-2.5 - 中位数(0.5)对应第5.5个位置,取
-5和-6的平均值得到-5.5(若需整数中位数,可改用PERCENTILE_DIS(0.5)) - 第三四分位数(0.75)对应第7.5个位置,取
-7和-8的平均值得到-7.5
- 第一四分位数(0.25)对应第2.5个位置,取
内容的提问来源于stack exchange,提问作者Betjamin Richards
相关产品推荐
相关产品推荐

