Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fusionner deux tables et trouver des dates et des lacunes qui se chevauchent

Cette requête, utilisant lead() analytique Fait le travail. Colonne note indique si la ligne provient de vos données ou s'il manque un espace :

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)

Au début, les données ne sont pas pivotées juste pour avoir toutes les dates dans une colonne, c'est plus facile pour d'autres analyses. Union supprime les valeurs en double. Colonne dir informe s'il s'agit de from ou to Date. Ensuite, lead la logique est appliquée, selon le type de cette direction. Je pense qu'il peut être quelque peu simplifié :)