我有一个名为计时的表,我们在其中存储了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条答案
按热度按时间3wabscal1#
通常,如果你想知道百分位数,你使用
cume_dist
比ntile
更安全。这是因为ntile
在给定很少的输入时表现得很奇怪。考虑一下:字符串
你可以看到
ntile
只使用了100个桶中的前4个,而cume_dist
总是给你一个从0到1的数字。所以如果你想找出第99个百分位数,你可以扔掉所有cume_dist
小于0.99的东西,从剩下的东西中取最小的v
。如果你使用的是Postgres 9.4+,那么
percentile_cont
andpercentile_disc
会让它变得更容易,因为你不必自己构建桶。前者甚至可以在值之间进行插值,如果你有一个小数据集,这也很有用。6ojccjat2#
编辑:
请注意,自从我最初回答这个问题以来,Postgres已经获得了额外的聚合函数来帮助解决这个问题。参见
percentile_disc
和percentile_cont
here。这些都是在9.4中引入的。原始答案:
ntile
是计算 * 分位数 * 的方法(在其他n分位数中,如四分位数,十分位数等)。ntile
将表尽可能平均地分组到指定数量的桶中。如果指定4个桶,则为四分位数。10为十分位数。对于 percentile,您可以将bucket的数量设置为100。
我不确定500在这里的位置..
如果你不关心
avg
或max
,你可以从你的查询中删除一堆。所以它看起来像这样:字符串