具体的请参考:https://www.yuhuashi.info/post/74.html
测试表test:
在下面查询中的数据时候,会发现日期并不完整,希望日期可以自动补全,并且没有数据的字段自动以上一行的数据补全。
SQL> select * from test; EVENT_DATE BUILD_NAME ---------- --------------------------- 2016-06-25 B1 2016-10-20 B1 2016-11-27 B1 2017-01-15 B1 2017-02-03 B1 2017-02-07 B1 2017-02-09 B1 2016-07-05 B5 2016-07-17 B5 2016-07-20 B5 2016-08-22 B5 EVENT_DATE BUILD_NAME ---------- ------------------------- 2016-10-11 B5 2016-11-03 B5 2016-12-19 B5 2017-03-08 B5 15 rows selected.
在上面查询中的数据时候,会发现日期并不完整,希望日期可以自动补全,并且没有数据的字段自动以上一行的数据补全,也就是想实现如下的效果
DATES BUILD_NAME_NEW ---------- ---------------------- 2016-06-25 B1 2016-06-26 B1 2016-06-27 B1 2016-06-28 B1 2016-06-29 B1 2016-06-30 B1 2016-07-01 B1 2016-07-02 B1 2016-07-03 B1 2016-07-04 B1 2016-07-05 B5 DATES BUILD_NAME_NEW ---------- ------------------------ 2016-07-06 B5 2016-07-07 B5 2016-07-08 B5 2016-07-09 B5 2016-07-10 B5 2016-07-11 B5 2016-07-12 B5 2016-07-13 B5 2016-07-14 B5 2016-07-15 B5 2016-07-16 B5 ...... 2017-02-22 B1 2017-02-23 B1 2017-02-24 B1 2017-02-25 B1 2017-02-26 B1 2017-02-27 B1 2017-02-28 B1 2017-03-01 B1 2017-03-02 B1 2017-03-03 B1 2017-03-04 B1 DATES BUILD_NAME_NEW ---------- ------------------------- 2017-03-05 B1 2017-03-06 B1 2017-03-07 B1 2017-03-08 B5 257 rows selected.
下面给出最终的实现语句:
/* Formatted on 2018/4/24 星期二 上午 11:30:07 (QP5 v5.313) */ WITH aa AS ( SELECT bb.startdate + LEVEL - 1 dates FROM (SELECT MAX (event_date) enddate, MIN (event_date) startdate FROM test) bb CONNECT BY LEVEL <= FLOOR (bb.enddate - bb.startdate) + 1), bb AS ( SELECT DISTINCT a.dates, t.build_name, t.event_date FROM aa a LEFT JOIN test t ON t.event_date = a.dates ORDER BY a.dates) SELECT dates, build_name, event_date, NVL (build_name, LAG (build_name IGNORE NULLS) OVER (ORDER BY dates)) build_name_new FROM bb;