postgresql 如何在postgres中计算百分比

gk7wooem  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(219)

我有一个名为计时的表,我们在其中存储了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

字符串
但是我怎么找到百分位数呢

3wabscal

3wabscal1#

通常,如果你想知道百分位数,你使用cume_distntile更安全。这是因为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
如果你使用的是Postgres 9.4+,那么percentile_cont and percentile_disc会让它变得更容易,因为你不必自己构建桶。前者甚至可以在值之间进行插值,如果你有一个小数据集,这也很有用。

6ojccjat

6ojccjat2#

编辑:

请注意,自从我最初回答这个问题以来,Postgres已经获得了额外的聚合函数来帮助解决这个问题。参见percentile_discpercentile_conthere。这些都是在9.4中引入的。

原始答案:

ntile是计算 * 分位数 * 的方法(在其他n分位数中,如四分位数,十分位数等)。
ntile将表尽可能平均地分组到指定数量的桶中。如果指定4个桶,则为四分位数。10为十分位数。
对于 percentile,您可以将bucket的数量设置为100。
我不确定500在这里的位置..
如果你不关心avgmax,你可以从你的查询中删除一堆。所以它看起来像这样:

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

字符串

相关问题