2015-01-11 63 views
5

我有一個表,稱爲計時,我們正在爲負載測試存儲100萬響應計時,現在我們需要將此數據分成100組,即將第一組500個記錄作爲一個組,並計算每組的百分位數,而不是平均數。如何計算postgres中的百分位數

到目前爲止,我想這個查詢

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 

但我有如何找到百分

回答

6

ntile是怎麼計算百分(其它N區塊,如四分,等分中,等等。)。

ntile儘可能平等地將表分組到指定數量的桶中。如果你指定了4個桶,那將是一個四分位數。 10將是一個十分之一。

對於百分,您將設置桶的數量爲100

我不知道其中500來這裏...如果你想確定哪些百分您的數據(即將百萬個計時儘可能等分爲100個桶),那麼您將使用ntile,參數爲100,並且這些組將有500多個條目。

如果您不關心avgmax,您可以從查詢中刪除一堆。因此,這將是這個樣子:

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

每組包含500條記錄,因爲會有100組..所以百分比會自動計算百分位數?爲每個組? – lampdev

+0

不確定您的意思是「每個組包含500條記錄」。什麼組?你所有的數據都在'data'表中。這個數據上的'ntile(100)'將把數據分成100個組,然而很多行將會是這樣。這就是人們如何計算任何給定數據集的百分比。如果您先將其分成500組,則不再是百分點... – khampson

+0

我們需要繪製從asc到desc順序的百分位圖.table包含50,000個計時,現在我們需要將這50,000個計時分成組和計算每個組的百分比,我對此很困惑。或者我們如何實現這個 – lampdev

4

通常,如果你想知道百分,你是更安全的使用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只使用第4出100桶,其中cume_dist總是讓你從0到1的號碼了,所以如果你想找出第99百分位數,你可以把cume_dist放在0.99以下,並把剩下的最小的v扔掉。

如果您使用的是Postgres 9.4+,那麼percentile_cont and percentile_disc可以使它更容易,因爲您不必自己構建存儲桶。前者甚至給你插值之間的值,如果你有一個小的數據集,這又可能是有用的。