Truy vấn này, sử dụng lead()
phân tích Làm công việc. Cột note
hiển thị nếu hàng đến từ dữ liệu của bạn hoặc nếu nó bị thiếu khoảng trống:
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)
Lúc đầu, dữ liệu được bỏ chia chỉ để có tất cả các ngày trong một cột, việc phân tích sâu hơn sẽ dễ dàng hơn. Union loại bỏ các giá trị trùng lặp. Cột dir
thông báo nếu đây là from
hoặc to
ngày. Sau đó, lead
logic được áp dụng, tùy thuộc vào loại hướng này. Tôi nghĩ nó có thể được đơn giản hóa phần nào :)