如何计算各种百分位数的计数(*)

时间:2014-01-24 12:06:35

标签: sql postgresql

说,我有一个表,其中包含从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>=990 AND x<1000) AS prcntl_100,

SQL语句的大小不是考虑因素,因为我可以动态生成它。我只是想知道是否有一种惯用的方法来获得每个百分位数的人口数。

1 个答案:

答案 0 :(得分: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;

这限制了您必须编写的代码量。