我出乎意料地无法找到postgresql的第n个百分位函数。
我通过mondrian olap工具使用这个,所以我只需要一个返回95%的聚合函数。
我找到了这个链接:
http://www.postgresql.org/message-id/162867790907102334r71db0227jfa0e4bd96f48b8e4@mail.gmail.com
但由于某种原因,该百分位函数中的代码在某些情况下使用某些查询返回空值。我已经检查了数据,数据中没有什么奇怪的东西可能会导致这种情况!
答案 0 :(得分:28)
使用PostgreSQL 9.4,现在支持百分位数,在有序集合聚合函数中实现:
percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression)
连续百分位数:返回与指定值对应的值 排序中的分数,在相邻输入项之间进行插值 如果需要的话
percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)
多个连续百分位数:返回匹配的结果数组 fractions参数的形状,每个非null元素 替换为与该百分位数对应的值
有关详细信息,请参阅文档:http://www.postgresql.org/docs/current/static/functions-aggregate.html
答案 1 :(得分:18)
ntile
功能在这里非常有用。我有一张桌子test_temp
:
select * from test_temp
score
integer
3
5
2
10
4
8
7
12
select score, ntile(4) over (order by score) as quartile from test_temp;
score quartile
integer integer
2 1
3 1
4 2
5 2
7 3
8 3
10 4
12 4
ntile(4) over (order by score)
按分数对列进行排序,将其拆分为四个偶数组(如果数字均分),并根据订单分配组号。
由于我这里有8个数字,它们代表第0个,第12.5个,第25个,第37.5个,第50个,第62.5个,第75个和第87.5个百分位数。因此,如果我只取quartile
为2的结果,我将得到第25和37.5百分位数。
with ranked_test as (
select score, ntile(4) over (order by score) as quartile from temp_test
)
select min(score) from ranked_test
where quartile = 2
group by quartile;
返回4
,这是8列表中第三高的数字。
如果您有一个较大的表并使用ntile(100)
,您过滤的列将是百分位数,您可以使用与上面相同的查询。
答案 2 :(得分:1)
如上面的评论,解决方案在这里,只需确保添加数组排序和percentile_cont函数!