2014-01-24 136 views
0

說,我有一個表格,其中保存的整數值從0到9,999,我想在每個百分位數中作出一個分佈圖。如何計算各種百分位數的計數(*)

下面是想到的。有沒有更好的辦法?

CREATE TABLE A(x INTEGER); 

SELECT 
(SELECT COUNT(*) FROM A WHERE x>=0 AND x<10) AS prcntl_01, 
(SELECT COUNT(*) FROM A WHERE x>=10 AND x<20) AS prcntl_02, 
(SELECT COUNT(*) FROM A WHERE x>=20 AND x<30) AS prcntl_03, 
(SELECT COUNT(*) FROM A WHERE x>=30 AND x<40) AS prcntl_04, 
(SELECT COUNT(*) FROM A WHERE x>=40 AND x<50) AS prcntl_05, 
... 
(SELECT COUNT(*) FROM A WHERE x>=9990 AND x<10000) AS prcntl_100, 

SQL語句的大小不是一個考慮因素,因爲我可以在運行中生成它。我只是想知道是否有一種習慣的方式來獲得每個百分點的人口數量。

+0

百分位數是什麼意思?每個百分位數應該有相同的行數(1/100的觀察值),所以我不明白你在這裏計算的是什麼。看看[ntile](http://www.postgresql.org/docs/8.4/static/functions-window.html)。在9.4(devel)中有一些[百分位數函數](http://www.postgresql.org/docs/devel/static/functions-aggregate.html) –

回答

3

使用條件的聚集,而不是多個查詢:

SELECT sum(case when x >= 0 AND x < 10 then 1 else 0 end) as prcntl_01, 
     sum(case when x >= 10 AND x < 20 then 1 else 0 end) as prcntl_02, 
     . . . 
     sum(case when x >= 990 AND x < 1000 then 1 else 0 end) as prcntl_100 
FROM A; 

如果你想在不同的行中的值,而不是列,你可以簡單地做:

select n as which, 
     sum(case when x >= (n - 1)*10 and x < n*10 - 1 then 1 else 0 end) as percentile 
from A cross join 
    generate_series(1, 100) as n 
group by n; 

這限制了代碼量你必須寫。

+0

第二種形式必須有拼寫錯誤(百分位數之後的逗號)。此外,一旦刪除PostgreSQL的抱怨:錯誤:列「n.n」必須出現在GROUP BY子句中或用於集合函數 –

+0

@MarcusJuniusBrutus。 。 。謝謝。固定。 –