Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Mesclar duas tabelas e encontrar datas e lacunas sobrepostas


Esta consulta, usando lead() analítico faz o trabalho. Coluna note mostra se a linha vem de seus dados ou se está faltando lacuna:
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)



No início, os dados não são dinamizados apenas para ter todas as datas em uma coluna, é mais fácil para análises adicionais. União remove valores duplicados. Coluna dir informa se é from ou to encontro. Então lead lógica é aplicada, dependendo do tipo desta direção. Acho que pode ser um pouco simplificado :)