2016-12-19 6 views
1

私のテーブルの各人物の2つの日付の間に毎月の行を作成する必要があります(結果は最初の日でなければなりません)。私は私のソーステーブルに次のデータがある場合たとえば、:助けをPostgreSQLの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 

本当にありがとうございました:

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

を私は先の表の結果になりたいです。

ヶ月の最初の日と

答えて

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

計算最小値とそれぞれの人のための最大の日付、その後generate_seriesを使用してこれらの日付の間、毎月ベースの範囲を生成します。

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は、入力からすべての行の計算を強制します。

この解決策では、日付ごとに1人の行に複数の行があり、可能な限り高い範囲があることを考慮しています。

関連する問題