sql >> Database >  >> RDS >> Oracle

Oracle SQL-query - genereer records tussen twee datums

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



  1. MySQL-wachtwoordfunctie

  2. fout bij het installeren van caldecott

  3. Omgaan met niet-bestaande waarden in sql-query-expressie voor ssrs-diagram

  4. Standaardmethode voor de IF()-functie van MySQL