Đây là một cách để làm điều này. Nó giả định tất cả các ngày đều là ngày thuần túy (không có thành phần thời gian trong ngày - trên thực tế có nghĩa là thời gian trong ngày là 00:00:00 ở mọi nơi). Nó cũng giả định rằng bạn muốn đầu ra bao gồm tất cả các ngày từ ngày đầu tiên đến ngày cuối cùng trong đầu vào.
Ngày đầu tiên và ngày cuối cùng được tính trong truy vấn trong cùng. Sau đó, tất cả các ngày giữa chúng được tạo bằng truy vấn phân cấp (kết nối theo) và kết quả được nối trái với dữ liệu ban đầu. Sau đó, kết quả thu được bằng cách sử dụng last_value()
phân tích hàm với ignore nulls
tùy chọ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