Hier ist eine Möglichkeit, dies zu tun. Es wird davon ausgegangen, dass die Daten alle reine Daten sind (keine Tageszeitkomponente - was tatsächlich bedeutet, dass die Tageszeit überall 00:00:00 ist). Es wird auch davon ausgegangen, dass die Ausgabe alle Daten zwischen dem ersten und dem letzten Datum in den Eingaben enthalten soll.
Das erste und das letzte Datum werden in der innersten Abfrage berechnet. Dann werden alle Daten dazwischen mit einer hierarchischen Abfrage (Verbinden durch) erstellt, und das Ergebnis wird mit den ursprünglichen Daten linksverknüpft. Die Ausgabe wird dann mithilfe des analytischen last_value()
erhalten Funktion mit der 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