Voici une façon de procéder. Il suppose que les dates sont toutes des dates pures (pas de composant d'heure du jour - ce qui signifie en fait que l'heure du jour est 00:00:00 partout). Cela suppose également que vous souhaitez que la sortie inclue toutes les dates entre la première et la dernière date dans les entrées.
Les première et dernière dates sont calculées dans la requête la plus interne. Ensuite, toutes les dates entre elles sont créées avec une requête hiérarchique (connecter par), et le résultat est joint à gauche aux données d'origine. La sortie est ensuite obtenue en utilisant l'analytique last_value()
fonction avec le ignore nulls
option.
with
inputs ( dt, value ) as (
select to_date('8/1/2017', 'mm/dd/yyyy'), 'x' from dual union all
select to_date('8/5/2017', 'mm/dd/yyyy'), 'b' from dual union all
select to_date('8/7/2017', 'mm/dd/yyyy'), 'a' from dual
)
-- End of simulated input data (for testing purposes only, not part of the solution).
-- Use your actual table and column names in the SQL query that begins below this line.
select dt, last_value(value ignore nulls) over (order by dt) as value
from ( select f.dt, i.value
from ( select min_dt + level - 1 as dt
from ( select max(dt) as max_dt, min(dt) as min_dt
from inputs
)
connect by level <= max_dt - min_dt + 1
) f
left outer join inputs i on f.dt = i.dt
)
;
DT VALUE
---------- -----
2017-08-01 x
2017-08-02 x
2017-08-03 x
2017-08-04 x
2017-08-05 b
2017-08-06 b
2017-08-07 a