トップページに戻る
次の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式で、過去データと連結しているかを判定してます。