sql >> Database >  >> RDS >> Oracle

Voeg twee tabellen samen en vind overlappende datums en hiaten

Deze query, met behulp van analytische lead() doet het werk. Kolom note laat zien of de rij uit uw gegevens komt of dat er een opening ontbreekt:

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)

In het begin worden de gegevens niet geroteerd om alle datums in één kolom te hebben, het is gemakkelijker voor verdere analyses. Union verwijdert dubbele waarden. Kolom dir informeert of dit from is of to datum. Dan lead logica wordt toegepast, afhankelijk van het type van deze richting. Ik denk dat het wat vereenvoudigd kan worden :)




  1. Wat is het equivalent van Oracle's REF CURSOR in Postgresql bij gebruik van JDBC?

  2. Totaal aantal records per week

  3. Weet iemand de betekenis achter deze php-foutmelding?

  4. Maak een Insert... Select statement in Laravel