本文共 1825 字,大约阅读时间需要 6 分钟。
具体的请参考:
测试表test:
在下面查询中的数据时候,会发现日期并不完整,希望日期可以自动补全,并且没有数据的字段自动以上一行的数据补全。
SQL> select * from test;EVENT_DATE BUILD_NAME---------- ---------------------------2016-06-25 B12016-10-20 B12016-11-27 B12017-01-15 B12017-02-03 B12017-02-07 B12017-02-09 B12016-07-05 B52016-07-17 B52016-07-20 B52016-08-22 B5EVENT_DATE BUILD_NAME---------- -------------------------2016-10-11 B52016-11-03 B52016-12-19 B52017-03-08 B515 rows selected.在上面查询中的数据时候,会发现日期并不完整,希望日期可以自动补全,并且没有数据的字段自动以上一行的数据补全,也就是想实现如下的效果
DATES BUILD_NAME_NEW---------- ----------------------2016-06-25 B12016-06-26 B12016-06-27 B12016-06-28 B12016-06-29 B12016-06-30 B12016-07-01 B12016-07-02 B12016-07-03 B12016-07-04 B12016-07-05 B5DATES BUILD_NAME_NEW---------- ------------------------2016-07-06 B52016-07-07 B52016-07-08 B52016-07-09 B52016-07-10 B52016-07-11 B52016-07-12 B52016-07-13 B52016-07-14 B52016-07-15 B52016-07-16 B5......2017-02-22 B12017-02-23 B12017-02-24 B12017-02-25 B12017-02-26 B12017-02-27 B12017-02-28 B12017-03-01 B12017-03-02 B12017-03-03 B12017-03-04 B1DATES BUILD_NAME_NEW---------- -------------------------2017-03-05 B12017-03-06 B12017-03-07 B12017-03-08 B5257 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;
转载地址:http://gdhji.baihongyu.com/