Hier is een manier om dit te doen. Het gaat ervan uit dat de datums allemaal pure datums zijn (geen tijdcomponent - wat in feite betekent dat de tijd van de dag overal 00:00:00 is). Er wordt ook vanuit gegaan dat u wilt dat de uitvoer alle datums tussen de eerste en de laatste datum in de invoer bevat.
De eerste en laatste datum worden berekend in de binnenste query. Vervolgens worden alle datums ertussen gemaakt met een hiërarchische (verbinden door) query, en het resultaat wordt links toegevoegd aan de oorspronkelijke gegevens. De uitvoer wordt dan verkregen met behulp van de analytische last_value()
functie met de ignore nulls
optie.
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