【问题标题】:how to calculate percentile in postgres如何在postgres中计算百分位数
【发布时间】:2015-03-09 03:46:43
【问题描述】:

我有一个名为时序的表,我们存储 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

但是我如何找到百分位数

【问题讨论】:

标签: postgresql postgis


【解决方案1】:

通常,如果您想知道百分位数,使用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

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

【讨论】:

  • 这是设计使然..您要求它使用大于您的数据的 n 存储桶..不确定您希望它给您什么。
【解决方案2】:

编辑:

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

原答案:

ntile 是计算百分位数的方法(以及其他 n 分位数,例如四分位数、十分位数等)。

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

对于 percentile,您可以将桶数设置为 100。

我不确定 500 的位置...如果您想确定您的数据在哪个 percentile 中(即将百万次时间尽可能平均地分成 100 个桶),您将使用 ntile 的参数为 100,并且这些组将有超过 500 个条目。

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

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

【讨论】:

  • 每组包含 500 条记录,因为会有 100 组.. 所以 ntile 会自动计算百分位数?每个组?
  • 不确定“每个组包含 500 条记录”是什么意思。有哪些群体?您的所有数据都在data 表中。该数据上的ntile(100) 会将数据存储到 100 个组中,无论行数如何。这就是计算任何给定数据集的百分位数的方式。如果你先把它分成 500 个组,那就不再是百分位数了……
  • 我们需要绘制一个从 asc 到 desc 顺序的百分位图 ..table 包含 50,000 个时序,现在我们需要将这 50, 000 个时序分组并计算每个组的百分位数,,我对此有点困惑。或者我们怎样才能做到这一点
  • 为什么要先分组呢?这是我不清楚的部分。如果您想计算时间数据的百分位数,通常会在整个数据集中完成,否则最终结果实际上不再是您的数据集的百分位数。你会如何首先将它分成几组?基于什么标准?
  • NTILE 无法正确计算百分位数(或四分位数或任何其他类型的分位数)。 NTILE 不考虑平局,这意味着相同的值可能会出现在不同的桶中。换句话说——莎莉和乔都得了81%。使用 NTILE 计算每个人的百分位数,您可能会看到 Sally 或 Joe 的排名不同。这不是百分位数的工作原理。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 2016-04-12
  • 2016-07-12
  • 2015-05-02
  • 2018-05-19
  • 2011-12-29
  • 2013-06-20
  • 2017-10-12
相关资源
最近更新 更多