Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL-Abfrage - Generieren Sie Datensätze zwischen zwei Daten

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