Kueri ini, menggunakan lead()
analitik melakukan pekerjaan. Kolom note
menunjukkan jika baris berasal dari data Anda atau jika ada celah yang hilang:
select id, d1, d2, case dir when 3 then 'GAP' end note
from (
select id,
case when dir = 2
and lead(dir) over (partition by id order by dt) = 1
and lead(dt) over (partition by id order by dt) <> dt + 1
then dt + 1
else dt
end d1,
case when dir = 2
and lead(dir) over (partition by id order by dt) = 1
and lead(dt) over (partition by id order by dt) <> dt + 1
then 3
else dir
end dir,
case when lead(dir) over (partition by id order by dt) = 1
then lead(dt) over (partition by id order by dt) - 1
else lead(dt) over (partition by id order by dt)
end d2
from (
select * from a unpivot (dt for dir in (validfrom as 1, validto as 2)) union
select * from b unpivot (dt for dir in (validfrom as 1, validto as 2)) ) )
where dir in (1, 3)
Pada awalnya data tidak dipivot hanya untuk memiliki semua tanggal dalam satu kolom, lebih mudah untuk analitik lebih lanjut. Union menghapus nilai yang digandakan. Kolom dir
menginformasikan apakah ini from
atau to
tanggal. Kemudian lead
logika diterapkan, tergantung pada jenis arah ini. Saya pikir ini bisa disederhanakan :)