person
単位の日付とそのシーケンスの合計amount
で、連続したシーケンスを特定しようとしています。私records
表には、次のようになります。開始日と終了日からシーケンスを特定して集計する方法
person start_date end_date amount
1 2015-09-10 2015-09-11 500
1 2015-09-11 2015-09-12 100
1 2015-09-13 2015-09-14 200
1 2015-10-05 2015-10-07 2000
2 2015-10-05 2015-10-05 300
2 2015-10-06 2015-10-06 1000
3 2015-04-23 2015-04-23 900
結果のクエリは、このようになります。以下は
person sequence_start_date sequence_end_date amount
1 2015-09-10 2015-09-14 800
1 2015-10-05 2015-10-07 2000
2 2015-10-05 2015-10-06 1400
3 2015-04-23 2015-04-23 900
、私はシーケンスstart_date
とend_date
を識別するために、LAGおよびLEADを使用することができますが、私が持っていませんamount
を集計する方法。私は答えはシーケンスによって分割されるROW_NUMBER()
ウィンドウ関数のいくつかの並べ替えを含むと仮定している、私はちょうどシーケンスシーケンスを関数に識別可能にする方法を見つけることができません。
SELECT
person
,COALESCE(sequence_start_date, LAG(sequence_start_date, 1) OVER (ORDER BY person, start_date)) AS "sequence_start_date"
,COALESCE(sequence_end_date, LEAD(sequence_end_date, 1) OVER (ORDER BY person, start_date)) AS "sequence_end_date"
FROM
(
SELECT
person
,start_date
,end_date
,CASE WHEN LAG(end_date, 1) OVER (PARTITION BY person ORDER BY start_date) + interval '1 day' = start_date
THEN NULL
ELSE start_date
END AS "sequence_start_date"
,CASE WHEN LEAD(start_date, 1) OVER (PARTITION BY person ORDER BY start_date) - interval '1 day' = end_date
THEN NULL
ELSE end_date
END AS "sequence_end_date"
,amount
FROM records
) sq
既存のクエリのサブクエリは、それらのカラム名と矛盾する 'sequence_start_date'と' sequence_end_date'値を生成します。 –
あなたのデータは少し矛盾しているようです。場合によっては、同じ行の前の行の終了日と同じ行の開始日と同じですが、それ以外の場合は開始日が前の終了日の1日後です。これはデータのエラーですか、どちらのケースも対応する必要がありますか? –