Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Führen Sie zwei Tabellen zusammen und finden Sie sich überschneidende Daten und Lücken

Diese Abfrage mit analytischem lead() macht den Job. Spalte note zeigt an, ob die Zeile aus Ihren Daten stammt oder ob eine Lücke fehlt:

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)

Zunächst sind die Daten unpivotiert, nur um alle Daten in einer Spalte zu haben, es ist einfacher für weitere Analysen. Union entfernt doppelte Werte. Spalte dir informiert, ob dies from ist oder to Datum. Dann lead Logik angewendet, je nach Art dieser Richtung. Ich denke, es kann etwas vereinfacht werden :)