sql >> Databáze >  >> RDS >> Oracle

Sloučte dvě tabulky a najděte překrývající se data a mezery

Tento dotaz pomocí analytického lead() dělá práci. Sloupec note ukazuje, zda řádek pochází z vašich dat nebo zda v něm chybí mezera:

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)

Nejprve jsou data unpivoted, aby byla všechna data v jednom sloupci, je to jednodušší pro další analýzy. Union odstraní duplicitní hodnoty. Sloupec dir informuje, zda se jedná o from nebo to datum. Poté lead je aplikována logika v závislosti na typu tohoto směru. Myslím, že se to dá trochu zjednodušit :)




  1. SCD typ 6

  2. Automatické dokončování Jquery a PHP:vyplnění vstupního pole daty z databáze mySQL na základě vybrané možnosti v poli automatického doplňování

  3. Mínus vs kromě rozdílu v ORACLE/SQL Server

  4. Jak upsert pandas DataFrame do PostgreSQL tabulky?