如何计算postgres中的百分位数

时间:2015-01-11 04:36:36

标签: postgresql postgis

我有一个称为时间的表,我们正在为负载测试存储100万个响应时间,现在我们需要将这些数据分成100组,即 - 前500个记录作为一个组,依此类推,并计算每个组的百分位数,而不是比平均水平。

到目前为止,我尝试了这个查询

Select quartile
     , avg(data) 
     , max(data) 
  FROM (

        SELECT data
             , ntile(500) over (order by data) as quartile
          FROM data
       ) x
 GROUP BY quartile
 ORDER BY quartile

但我如何找到百分位数

2 个答案:

答案 0 :(得分:8)

通常,如果您想知道百分位数,使用cume_dist比使用ntile更安全。这是因为ntile在给出少量输入时表现得很奇怪。考虑:

=# select v, 
          ntile(100) OVER (ORDER BY v),
          cume_dist() OVER (ORDER BY v)
   FROM (VALUES (1), (2), (4), (4)) x(v);

 v | ntile | cume_dist 
---+-------+-----------
 1 |     1 |      0.25
 2 |     2 |       0.5
 4 |     3 |         1
 4 |     4 |         1

你可以看到ntile只使用前100个桶中的前4个,其中cume_dist总是给你一个从0到1的数字。所以如果你想找出第99个百分位,那么你可以丢弃cume_dist低于0.99的所有内容,并从左边的v中取出最小的class LoginController < ApplicationController def new cookies[:id]=rand(1000) render "index" end end

如果您使用的是Postgres 9.4+,那么percentile_cont and percentile_disc会让它更容易,因为您不必自己构建存储桶。前者甚至可以在值之间进行插值,如果您有一个小数据集,这也可能很有用。

答案 1 :(得分:7)

修改

请注意,由于我最初回答了这个问题,Postgres已经获得了额外的聚合功能来帮助解决这个问题。请参阅percentile_discpercentile_cont here。这些是在9.4中引入的。

原始答案:

ntile是计算百分位数(以及其他n-tiles,如四分位数,十分位数等)的方式。

ntile将表分组到指定数量的存储桶中尽可能相等。如果你指定了4个桶,那将是一个四分位数。 10将是一个十分位数。

对于百分位数,您可以将存储桶数设置为100。

我不知道500在这里的位置...如果你想确定你的数据属于哪个百分位(即将百万个时间分成尽可能平均的100个桶),你会使用参数为100的ntile,并且这些组的条目将超过500个。

如果您不关心avgmax,则可以从查询中删除一堆。所以它看起来像这样:

SELECT data, ntile(100) over (order by data) AS percentile
FROM data
ORDER BY data