分析 lead()
を使用したこのクエリ 仕事をします。列 note
行がデータに由来するかどうか、またはギャップが欠落しているかどうかを示します:
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)
プレ>
最初は、すべての日付を 1 つの列に表示するためだけにデータのピボットが解除され、その後の分析が容易になります。 Union は、重複した値を削除します。列
dir
これがfrom
かどうかを通知します またはto
日にち。次にlead
この方向のタイプに応じて、ロジックが適用されます。いくらか単純化できると思います:)