トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

9-3 開始日と終了日をまとめる

SQLパズル

TimeSheetsテーブル
StartDate   EndDate
----------  ----------
2005-01-01  2005-01-03
2005-01-02  2005-01-04
2005-01-04  2005-01-05
2005-01-06  2005-01-09
2005-01-09  2005-01-09
2005-01-12  2005-01-15
2005-01-13  2005-01-14
2005-01-14  2005-01-14
2005-01-17  2005-01-17

TimeSheetsテーブルの重複した期間をまとめて、
期間の開始と終了を表示する。
TimeSheetsのプライマリキーは、StartDateとする。

出力結果
StartDate   EndDate
----------  ----------
2005-01-01  2005-01-05
2005-01-06  2005-01-09
2005-01-12  2005-01-15
2005-01-17  2005-01-17

SQLパズル 第2版のパズル59 [期間を結合する] を参考にさせていただきました


データ作成スクリプト

create table TimeSheets(
StartDate Date,
EndDate   Date,
primary key (StartDate));

insert into TimeSheets
values(date '2005-01-01',date '2005-01-03'),
      (date '2005-01-02',date '2005-01-04'),
      (date '2005-01-04',date '2005-01-05'),
      (date '2005-01-06',date '2005-01-09'),
      (date '2005-01-09',date '2005-01-09'),
      (date '2005-01-12',date '2005-01-15'),
      (date '2005-01-13',date '2005-01-14'),
      (date '2005-01-14',date '2005-01-14'),
      (date '2005-01-17',date '2005-01-17');


SQL

select min(StartDate) as StartDate,max(EndDate) as EndDate
from (select StartDate,EndDate,
      sum(willSum) over(order by StartDate) as GID
      from (select StartDate,EndDate,
            case when StartDate
                   <= (select max(b.EndDate)
                       from TimeSheets b
                       where b.StartDate < a.StartDate)
                 then 0 else 1 end as willSum
            from TimeSheets a) a) a
group by GID
order by StartDate;


解説

case式で、過去データと連結しているかを判定してます。