我有一个称为时间的表,我们正在为负载测试存储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
但我如何找到百分位数
答案 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_disc
和percentile_cont
here。这些是在9.4中引入的。
原始答案:
ntile
是计算百分位数(以及其他n-tiles,如四分位数,十分位数等)的方式。
ntile
将表分组到指定数量的存储桶中尽可能相等。如果你指定了4个桶,那将是一个四分位数。 10将是一个十分位数。
对于百分位数,您可以将存储桶数设置为100。
我不知道500在这里的位置...如果你想确定你的数据属于哪个百分位(即将百万个时间分成尽可能平均的100个桶),你会使用参数为100的ntile
,并且这些组的条目将超过500个。
如果您不关心avg
或max
,则可以从查询中删除一堆。所以它看起来像这样:
SELECT data, ntile(100) over (order by data) AS percentile
FROM data
ORDER BY data