创建一个视图以插入缺失的月份并将前一行的数据复制到该缺失的月

时间:2015-09-11 13:03:14

标签: sql oracle

我想创建一个视图,它会插入Missing Month并将上个月的数据复制到缺失的月份。
例如,我有三列以下,因为您可以看到第4和第7个缺失,所以在月份4个月将复制3个数据,并在7个月内复制6个数据 我想指定最短和最长日期

CID-----PID-----Time  
2222-----7------06-03-2015  
2222-----7------08-05-2015  
2222-----7------29-05-2015  
2222-----8------01-06-2015  
2222-----8------01-06-2015  
2222-----8------11-08-2015  
2222-----8------11-08-2015  
2222-----8------20-08-2015 
3539     5      17-04-2015
3539     8      12-08-2015
4987     10     06-03-2015
4987     12     01-06-2015
4987     13     17-07-2015

我想在View

中输出这样的内容
CID---- PID---Time  
2222--- 7-----201503  
2222--- 7-----201504  
2222----7-----201505  
2222----8-----201506  
2222----8-----201507  
2222----8-----201508 
3539    5     201504
3539    5     201505
3539    5     201506
3539    5     201507
3539    8     201508
4987    10    201503
4987    10    201504
4987    10    201505
4987    12    201506
4987    13    201507
4987    13    201508

发布了类似的问题/答案,但我无法申请。 SQL select, pad with chronological missing months

1 个答案:

答案 0 :(得分:0)

我认为你可以使用这个:

WITH 
m AS
    (SELECT ADD_MONTHS((SELECT MIN(TRUNC(MON_TIME, 'MM')) FROM My_Table), LEVEL-1) AS all_months 
    FROM dual 
    CONNECT BY ADD_MONTHS((SELECT MIN(TRUNC(MON_TIME, 'MM')) FROM My_Table), LEVEL-1) <= (SELECT MAX(MON_TIME) FROM My_Table))
SELECT DISTINCT 
    NVL(CID, LEAD(CID, 1) OVER (ORDER BY all_months)) AS CID,
    NVL(PID, LEAD(PID, 1) OVER (partition by CID ORDER BY all_months)) AS PID,
    TO_CHAR(all_months, 'YYYYMM') AS TIME   
FROM m
     LEFT OUTER JOIN My_Table ON TRUNC(MON_TIME, 'MM') = all_months
ORDER BY 3;

CID PID TIME
2222    7   201503
2222    7   201504
2222    7   201505
2222    8   201506
2222    8   201507
2222    8   201508