Function postgresql中的第n百分位计算

Function postgresql中的第n百分位计算,function,postgresql,percentile,Function,Postgresql,Percentile,令人惊讶的是,我一直无法找到postgresql的第n个百分位函数 我通过mondrian olap工具使用它,所以我只需要一个聚合函数,返回第95个百分位数 我确实找到了这个链接: 但出于某种原因,该百分位函数中的代码在某些情况下返回空值,并带有某些查询。我已经检查了数据,数据中似乎没有什么奇怪的原因 在这里,ntile函数非常有用。我有一个表test\u temp: select * from test_temp score integer 3 5 2 10 4 8 7 12 sele

令人惊讶的是,我一直无法找到postgresql的第n个百分位函数

我通过mondrian olap工具使用它,所以我只需要一个聚合函数,返回第95个百分位数

我确实找到了这个链接:


但出于某种原因,该百分位函数中的代码在某些情况下返回空值,并带有某些查询。我已经检查了数据,数据中似乎没有什么奇怪的原因

在这里,
ntile
函数非常有用。我有一个表
test\u 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(按分数排序)
按分数对列排序,将其分成四个偶数组(如果数字平分),并根据顺序分配组号

因为我这里有8个数字,它们代表第0、12.5、25、37.5、50、62.5、75和87.5个百分位数。因此,如果我只取四分位数为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)
,那么您筛选的列将是百分位,您可以使用与上面相同的查询。

对于PostgreSQL 9.4,现在有对百分位的本机支持,在有序集合聚合函数中实现:

连续百分位数:返回与指定百分比相对应的值 排序中的分数,在相邻输入项之间插值 如果需要

percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)
多个连续百分位数:返回匹配结果的数组 带有每个非空元素的分数参数的形状 替换为对应于该百分位的值

有关更多详细信息,请参阅文档:

请参见此处的一些示例:


您是否尝试过
percent\u rank()
cume\u dist()
ntile()
?详细信息。请参见:啊,我发现了另一个堆栈溢出条目,但没有创建数组排序函数。现在可以了。因此,可以关闭或删除此问题。文档中没有示例。你介意用几个简单的例子更新你的答案吗?这很奇怪,但谷歌搜索只找到了一些复杂的例子。
percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)
CREATE TABLE aa AS SELECT generate_series(1,20) AS a;
--SELECT 20

WITH subset AS (
    SELECT a AS val,
        ntile(4) OVER (ORDER BY a) AS tile
    FROM aa
)
SELECT tile, max(val)
FROM subset GROUP BY tile ORDER BY tile;

 tile | max
------+-----
    1 |   5
    2 |  10
    3 |  15
    4 |  20
(4 rows)