次のようなテーブルがあります。
Id Begin_Date End_date
1 01-JAN-12 05-JAN-12
1 01-FEB-12 01-MAR-12
1 15-FEB-12 05-MAR-12
特定の Id に対して、一連の日付範囲を提供します。日付がその ID の開始日と終了日の間にある場合、その ID は「オン」であるとしましょう。それ以外の場合は「オフ」
ここでの問題は、これらの最後の 2 行です。日付範囲が重複しており、互いに矛盾しています。2 行目は 1 が 2012 年 2 月 1 日から 123 年 3 月 1 日までの間「オン」であったことを主張していますが、3 行目は 1 が 2012 年 2 月 14 日より前にオフであったことを主張しています。同様に、2 行目は 1 が 02-MAR-12 にオフだったと主張していますが、3 行目はオンだったと主張しています。
私が適用したい調整ロジックは、矛盾が生じた場合に、可能な限り早い開始日とその後の可能な限り早い終了日を選択するというものです。したがって、結果は次のようになります。
Id Begin_Date End_date
1 01-JAN-12 05-JAN-12
1 01-FEB-12 01-MAR-12
ラグ分析機能でこれをやってのけましたが、他のユースケースで苦労しました。この入力データセットを取得します。
Id Begin_Date End_date
1 01-JAN-12 10-JAN-12
1 5-JAN-12 8-JAN-12
1 12-JAN-12 15-JAN-12
1 1-JAN-12 14-JAN-12
ここで出力として期待するのは次のとおりです。
Id Begin_Date End_date
1 01-JAN-12 8-JAN-12
1 01-JAN-12 14-JAN-12
...最初の行が最も早い開始日であり、その終了日がその後の最も早い終了日であるためです。次の行は前の終了日の後の最も早い開始日であり、その行の終了日はその後の最も早い終了日です。2012 年 1 月 14 日以降の開始日はないので、これで終了です。
この問題を解決する運はほとんどありません。私が試したアプローチの 1 つは、ID で分割されたランクを取得し、それを最大ランクと比較することでした。次に、ラグ関数を使用して以前のランクと比較しました。ただし、この戦略は上記のユースケースでは完全に失敗します。
助言がありますか?