现有如下表1:
日期        物料     仓库      库存金额     库存数量
20150729 AAA        S              100     50
20150731 BBB B               70     20
20150801 BBB B               120     60
20150802 BBB B               90     40
20150806 AAA         S               40     10
20150807 CCC W               70     20
20150810 BBB B               88     22
数据在时间上有连续的也有不连续,从哪一天开始的都有,现在求将数据按照时间连续,缺失的按照时间倒推最近的一条数据补齐。365天每天都要补齐,请问用Oracle的SQL怎么实现?
日期        物料     仓库      库存金额     库存数量
20150729 AAA        S              100     50
20150730 AAA        S              100     50
20150731 AAA        S              100     50
20150801 AAA        S              100     50
20150802 AAA        S              100     50
20150803 AAA        S              100     50
20150804 AAA        S              100     50
20150805 AAA        S              100     50
20150806 AAA         S               40     10
20150807 AAA         S               40     10
20150808 AAA         S               40     10
20150809 AAA         S               40     10
20150810 AAA         S               40     10
20150731 BBB B               70     20
20150801 BBB B               120     60
20150802 BBB B               90     40
20150803 BBB B               90     40
20150804 BBB B               90     40
20150805 BBB B               90     40
20150806 BBB B               90     40
20150807 BBB B               90     40
20150808 BBB B               90     40
20150809 BBB B               90     40
20150810 BBB B               88     22
20150807 CCC W               70     20
20150808 CCC W               70     20
20150809 CCC W               70     20
20150810 CCC W               70     20

解决方案 »

  1.   

    create view test_v as
    select date '2015-07-29' as 日期,'AAA' as 物料,'S' as 仓库,100 as 库存金额,50 as 库存数量 from dual union all
    select date '2015-07-31' as 日期,'BBB' as 物料,'B' as 仓库,70 as 库存金额,20 as 库存数量 from dual union all
    select date '2015-08-01' as 日期,'BBB' as 物料,'B' as 仓库,120 as 库存金额,60 as 库存数量 from dual union all
    select date '2015-08-02' as 日期,'BBB' as 物料,'B' as 仓库,90 as 库存金额,40 as 库存数量 from dual union all
    select date '2015-08-06' as 日期,'AAA' as 物料,'S' as 仓库,40 as 库存金额,10 as 库存数量 from dual union all
    select date '2015-08-07' as 日期,'CCC' as 物料,'W' as 仓库,70 as 库存金额,20 as 库存数量 from dual union all
    select date '2015-08-10' as 日期,'BBB' as 物料,'S' as 仓库,88 as 库存金额,22 as 库存数量 from dualWITH x0 AS (
    SELECT DATE '2015-07-29' AS d FROM dual),
    x1 AS (
    SELECT d+LEVEL-1 AS d1 FROM x0 CONNECT BY LEVEL<14
    )
    SELECT x.d1, CASE WHEN v.物料 IS NULL THEN LAG(v.物料 IGNORE NULLS) OVER(ORDER BY x.d1) ELSE v.物料 END AS 物料,
    case WHEN v.仓库 IS NULL THEN LAG(v.仓库 IGNORE NULLS) OVER(ORDER BY x.d1) ELSE v.仓库 END AS 仓库,
    case WHEN v.库存金额 IS NULL THEN LAG(v.库存金额 IGNORE NULLS) OVER(ORDER BY x.d1) ELSE v.库存金额 END AS 库存金额, 
    CASE WHEN v.库存数量 IS NULL THEN LAG(v.库存数量 IGNORE NULLS) OVER(ORDER BY x.d1) ELSE v.库存数量 END AS 库存数量 FROM x1 x
    LEFT JOIN test_v v ON (x.d1 = v.日期)
    ORDER BY x.d1 ASC