sql >> Databasteknik >  >> RDS >> Oracle

Slå samman två tabeller och hitta överlappande datum och luckor

Denna fråga använder analytisk lead() gör jobbet. Kolumn note visar om rad kommer från din data eller om det saknas gap:

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)

Till en början är data opivoterad bara för att ha alla datum i en kolumn, det är lättare för ytterligare analyser. Union tar bort dubblerade värden. Kolumn dir informerar om detta är from eller to datum. Sedan lead logik tillämpas, beroende på typen av denna riktning. Jag tror att det går att förenkla något :)




  1. Hur infogar man 'NULL'-värden i PostgreSQL-databasen med Python?

  2. Amazon RDS kan inte utföra kommandot SET GLOBAL

  3. MYSQL visar 0 även om resultat inte finns

  4. PostgreSQL - Uppdaterade tabellen i en funktion som jag skapade och nu har ordningen på raderna i tabellen ändrats