2013-10-13 3 views
0

하위 쿼리가 포함 된 Postgres 쿼리를 사용하여 12 행의 데이터 만 출력합니다. 정확하게보고 싶습니다. 이 행은 데이터베이스의 모든 연도에 걸친 월 평균 데이터를 나타내며 매월 한 행씩 표시됩니다. 쿼리 :Postgres는 연도 수를 기준으로 여러 개의 동일한 결과를 반환합니다.

SELECT 
    to_char(to_timestamp(to_char(subquery2.month, '999'), 'MM'), 'Mon') AS Month, 
    subquery2.month AS Month_num, 
    round(AVG(subquery2.all_use_tot), 2) AS Average_Withdrawals, 
    round(AVG(subquery2.all_cu_tot), 2) AS Average_Consumptive_Use 
FROM 
(SELECT 
    subquery1.month, 
    subquery1.year, 
    sum(subquery1.liv_tot) AS all_use_tot, 
    sum(subquery1.CU_total) AS all_cu_tot 
FROM 
    (SELECT 
     EXTRACT('Month' FROM withdrawals.begintime) AS month, 
     EXTRACT(YEAR FROM withdrawals.begintime)::int AS year, 
     tdx_ic_use_type.use_type_code AS Use_type, 
     sum(withdrawals.withdrawalvalue_mgd) AS liv_tot, 
     (tdx_ic_use_type.cufactor)*(sum(withdrawals.withdrawalvalue_mgd)) AS CU_total 
    FROM 
     medford.tdx_ic_use_type, 
     medford.withdrawalsites 
     JOIN medford.subshed2 ON ST_Contains(medford.subshed2.the_geom, medford.withdrawalsites.the_geom) 
     JOIN medford.withdrawals ON medford.withdrawals.ic_site_id = medford.withdrawalsites.ic_site_id 
    WHERE 
     subshed2.id = '${param.shed_id}' AND 
     withdrawalsites.ic_pr_use_type_id = tdx_ic_use_type.use_type_code AND 
     withdrawals.intervalcodes_id = 2 

    GROUP BY 
     year, 
     extract('Month' from withdrawals.begintime), 
     tdx_ic_use_type.cufactor, 
     Use_type 
    ORDER BY 
     year, extract('Month' from withdrawals.begintime) ASC 
     ) AS subquery1 
GROUP BY 
    subquery1.year, 
    subquery1.month 
) AS subquery2 
GROUP BY 
    subquery2.month 
ORDER BY 
    subquery2.month 

출력은 보이는 무엇과 같은 :

"Jan" 1 1426.50 472.65 
"Feb" 2 1449.00 482.10 
"Mar" 3 1459.50 485.55 
"Apr" 4 1470.00 489.00 
"May" 5 1480.50 492.45 
"Jun" 6 1491.00 495.90 
"Jul" 7 1489.50 493.35 
"Aug" 8 1512.00 502.80 
"Sep" 9 1510.50 500.25 
"Oct" 10 1533.00 509.70 
"Nov" 11 1543.50 513.15 
"Dec" 12 1542.00 510.60 

나는 데이터베이스의 날짜 컬럼에서 추출 한 달 열입니다. 이 쿼리의 결과를 사용하여 배열에 저장하고 있지만이 정확한 결과를 테이블에있는 해마다 한 번씩 반복하고 싶습니다. 따라서 데이터베이스에 2 년의 데이터가있는 경우 24 개의 출력 행이 있어야하며 동일한 행 중 12 개가 두 번 반복되어야합니다. 데이터베이스에 3 년의 데이터가있는 경우, 36 개의 출력 행 또는 동일한 행의 12 개가 3 회 반복되어야합니다. 내 쿼리에서이를 어떻게 수행합니까? 열의 값 (날짜/시간 필드에있는 연도 수)에 따라 검색어를 반복 할 수 있습니까?

답변

2

group by month에서 group by year, month으로 변경해야합니다. 달을 통해 (그러나 이것은 주어진 달의 데이터가 어디에 있는지 만 결과를 제공 할 것입니다.) 반복 들어

: (이 기반으로 : Writing a function in SQL to loop through a date range in a UDF)

select a::date 
from generate_series(
    '2011-06-01'::date, 
    '2012-06-01', 
    '1 month' 
) s(a) 

의견에 대한

+0

감사합니다. 내 질문을 실제 쿼리로 업데이트했습니다. 여러 가지 방법으로 제안을 시도했지만 값이 다른 해에 변경되어 동일한 12 개월 데이터 세트가 반복되지 않고 변경됩니다. 열의 값을 기반으로 쿼리를 반복 할 수있는 방법이 있습니까? – Jan

+0

개월을 생성하는 예제를 추가했습니다. 이 결과 집합에 참여해야합니다. –