sql >> Base de Datos >  >> RDS >> Oracle

Consulta Oracle SQL:genera registros entre dos fechas

Aquí hay una manera de hacer esto. Asume que las fechas son todas fechas puras (sin componente de hora del día, lo que de hecho significa que la hora del día es 00:00:00 en todas partes). También asume que desea que la salida incluya todas las fechas entre la primera y la última fecha en las entradas.

La primera y la última fecha se calculan en la consulta más interna. Luego, todas las fechas entre ellas se crean con una consulta jerárquica (conexión por), y el resultado se une a la izquierda con los datos originales. Luego, la salida se obtiene utilizando el last_value() analítico función con ignore nulls opción.

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