postgresql中的第n个百分位数计算
Posted
技术标签:
【中文标题】postgresql中的第n个百分位数计算【英文标题】:nth percentile calculations in postgresql 【发布时间】:2012-12-28 07:14:34 【问题描述】:我一直无法为 postgresql 找到第 n 个百分位函数。
我通过 mondrian olap 工具使用它,所以我只需要一个返回第 95 个百分位数的聚合函数。
我确实找到了这个链接:
http://www.postgresql.org/message-id/162867790907102334r71db0227jfa0e4bd96f48b8e4@mail.gmail.com
但由于某些原因,该百分位函数中的代码在某些情况下会返回空值。我检查了数据,数据中似乎没有什么奇怪的原因!
【问题讨论】:
您尝试过percent_rank()
、cume_dist()
或ntile()
吗?详情here.
也可以看看这个:***.com/a/14309370/330315
啊,我发现了其他堆栈溢出条目,但没有创建数组排序功能。现在可以了。所以这个问题可以关闭或删除。
【参考方案1】:
PostgreSQL 9.4 现在原生支持百分位数,在Ordered-Set Aggregate Functions中实现:
percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression)
连续百分位数:返回一个对应于指定的值 排序中的分数,在相邻输入项之间进行插值 如果需要
percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)
多个连续百分位数:返回匹配结果的数组 分数参数的形状,每个非空元素 替换为该百分位数对应的值
查看文档了解更多详情:http://www.postgresql.org/docs/current/static/functions-aggregate.html
并在此处查看一些示例:https://github.com/michaelpq/michaelpq.github.io/blob/master/_posts/2014-02-27-postgres-9-4-feature-highlight-within-group.markdown
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)
【讨论】:
文档没有示例。你介意用几个简单的例子来更新你的答案吗?这很奇怪,但谷歌搜索只得到了一些复杂的例子。【参考方案2】: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)
,您过滤的列将是百分位数,您可以使用与上述相同的查询。
【讨论】:
以上是关于postgresql中的第n个百分位数计算的主要内容,如果未能解决你的问题,请参考以下文章