2014-01-24 4 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에서 사용해야합니다. . . 고맙습니다. 결정된. –

관련 문제