2016-12-19 13 views
1

테이블의 각 사람마다 2 개의 날짜 사이에 매월 행을 작성해야합니다 (결과는 첫 번째 날이어야 함). 내 소스 테이블에 다음과 같은 데이터가있는 경우 예를 들어, :PostgreSQL에서 2 개월 간의 매월 행을 생성하십시오.

rowID | person  | startdate | enddate 
1  | 12345  | 2014-04-01 | 2014-11-30 
2  | 67890  | 2014-03-01 | 2014-05-01 

내 대상 테이블에 결과이 원하는 : 도움을 너무 많이

person | month 
12345 | 2014-04-01 
12345 | 2014-05-01 
12345 | 2014-06-01 
12345 | 2014-07-01 
12345 | 2014-08-01 
12345 | 2014-09-01 
12345 | 2014-10-01 
12345 | 2014-11-01 
67890 | 2014-03-01 
67890 | 2014-04-01 
67890 | 2014-05-01 

감사합니다. 다음 generate_series을 그 날짜 사이의 월 기반 범위를 생성하여

답변

0

CTE를 또는 측면에 대한 필요가 조인은`select` 목록에서 기능을 반환 세트를 사용

select 
    person, 
    generate_series(
     date_trunc('month', startdate), 
     enddate, '1 month' 
    )::date as month 
from rfem 
order by 1, 2 
; 
person | month  
--------+------------ 
    12345 | 2014-04-01 
    12345 | 2014-05-01 
    12345 | 2014-06-01 
    12345 | 2014-07-01 
    12345 | 2014-08-01 
    12345 | 2014-09-01 
    12345 | 2014-10-01 
    12345 | 2014-11-01 
    67890 | 2014-03-01 
    67890 | 2014-04-01 
    67890 | 2014-05-01 
+1

좋습니다. 따라서 ** 실제로 측면 결합이 필요합니다. –

+0

@a_horse_with_no_name 낙담은 여러 세트 반환 함수를위한 것입니다. –

+0

@a_horse_with_no_name select 목록에있는 반환 함수 집합이 권장되지 않는 이유를 설명해 주시겠습니까? 또는 그것을 설명하는 링크? –

1

계산 최소 개월의 첫째 날에 각 사람에 대한 최대 날짜 :

WITH date_ranges AS (
SELECT 
    person, 
    min(date_trunc('month', startdate))::timestamptz AS min_start, 
    max(date_trunc('month', enddate))::timestamptz AS max_end 
FROM person_table 
GROUP BY 1 
) 
SELECT 
    dr.person, 
    ser.month::DATE as month 
FROM date_ranges AS dr, 
    generate_series(min_start, max_end, '1 month') AS ser(month) 

출력 작동 원리

person | month 
--------+------------ 
    12345 | 2014-04-01 
    12345 | 2014-05-01 
    12345 | 2014-06-01 
    12345 | 2014-07-01 
    12345 | 2014-08-01 
    12345 | 2014-09-01 
    12345 | 2014-10-01 
    12345 | 2014-11-01 
    67890 | 2014-03-01 
    67890 | 2014-04-01 
    67890 | 2014-05-01 

? 함수 호출에 대한 암시적인 LATERAL JOIN은 입력의 모든 행에 대한 계산을 강제 실행합니다.

이 솔루션은 날짜가있는 사람마다 두 개 이상의 행이있을 수 있으며 가능한 가장 높은 범위를 차지한다는 것을 고려합니다.