Oracle
 sql >> Database >  >> RDS >> Oracle

Query Oracle SQL:genera record tra due date

Ecco un modo per farlo. Presuppone che le date siano tutte date pure (nessuna componente dell'ora del giorno, il che in effetti significa che l'ora del giorno è 00:00:00 ovunque). Presuppone inoltre che tu voglia che l'output includa tutte le date comprese tra la prima e l'ultima data negli input.

La prima e l'ultima data vengono calcolate nella query più interna. Quindi tutte le date tra di loro vengono create con una query gerarchica (connetti per) e il risultato viene unito ai dati originali. L'output viene quindi ottenuto utilizzando l'analitico last_value() funzione con ignore nulls opzione.

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