2

私の質問は、2 行目の開始が最初の行の終了の翌日である場合、より多くの日付間隔を 1 つに結合することです。これらすべてのケースで、1 行だけにする必要があります。元:

id      start           end
10      20120101        20120125
10      20120201        20120225
10      20120226        20120302
10      20120303        20120304

    

でなければなりません

10      20120101        20120125
10      20120201        20120304

何か提案はありますか?

4

1 に答える 1

3

これが私の提案です。テーブルにこれらの行がある場合、それを「temp_table」と呼びましょう。関連する日付のみを保持するビューを作成できます。

CREATE VIEW temp_view AS
SELECT id, dd, ROWNUM AS nr
  FROM (
    SELECT s.ID, s.start_date AS dd --for izolated intervals, keep the wtart date
      FROM temp_table s, temp_table prv, temp_table nxt
     WHERE prv.end_date(+) = s.start_date-1 AND prv.ID(+) = s.ID
       AND s.end_date+1 = nxt.start_date(+) AND nxt.ID(+) = s.ID
       AND prv.ID IS NULL AND nxt.ID IS NULL
    UNION
    SELECT s.ID, decode(nxt.id, 
                   NULL, s.end_date, --no next interval => keep the end date
                   decode(prv.id,
                      NULL, s.start_date)  --no previous interval => keep the start date
                  ) AS dd 
      FROM temp_table s, temp_table prv, temp_table nxt
     WHERE prv.end_date(+) = s.start_date-1 AND prv.ID(+) = s.ID
       AND s.end_date+1 = nxt.start_date(+) AND nxt.ID(+) = s.ID
       AND (prv.ID IS NULL OR nxt.ID IS NULL)
    ORDER BY dd   --order all the dates ascending  
  ); 

このビューは次のようなものを返します。

ID  DD          NR
10  20120101    1
10  20120125    2
10  20120201    3
10  20120304    4

そして、次のようなクエリを実行できます。

SELECT start_dates.ID, start_dates.dd AS start_date, end_dates.dd AS end_date
  FROM temp_view start_dates, temp_view end_dates 
 WHERE start_dates.ID = end_dates.ID
   AND start_dates.nr+1 = end_dates.nr 
   AND MOD(start_dates.nr,2) = 1 

結果:

ID  START_DATE  END_DATE
10  20120101    20120125
10  20120201    20120304
于 2012-11-02T09:02:29.377 に答える