このlag
関数を使用して、前の行の値を参照することができます (クエリの一部として「前」の意味を定義します。「行番号」は疑似列であり、注文できる実際の列ではなく、開始日順に並べたい場合):
select start_date, end_date,
case
when lag_end_date is null then start_date
when lag_end_date = start_date then start_date
else lag_end_date
end as adj_start_date
from (
select start_date, end_date,
lag(end_date) over (order by start_date, end_date) as lag_end_date
from <your_table>
)
( SQL フィドル)。
の最初のwhen
節はcase
、最も早い開始日を持つ「最初の」行を扱っています。前の行がないため、lag
になりますnull
。
次に、結果をフィルタリングして、一致しないものを取得できstart_date
ますadj_start_date
。(別の SQL フィドル)。
a で同じ種類の構成を使用しmerge
て、更新を行うことができます。
merge into <your table>
using (
select r_id, start_date, end_date,
case when lag_end_date is null then null
when lag_end_date = start_date then null
else lag_end_date
end as adj_start_date
from (
select rowid as r_id, start_date, end_date,
lag(end_date) over (order by start_date, end_date) as lag_end_date
from t42
)
) t
on (your_table>.rowid = t.r_id and t.adj_start_date is not null)
when matched then
update set <your table>.start_date = t.adj_start_date;
( SQL フィドル)。