SQL自动为表中缺少的日期从上一个日期生成缺少的日期和价格

SQL自动为表中缺少的日期从上一个日期生成缺少的日期和价格,sql,oracle,Sql,Oracle,我有一个表MKT,其中包含以下字段:value\u date、stk\u exch、security、MKT\u price、source、currency、name 不包括星期六、星期日和其他市场假期,每天有500种证券 我需要一个sql自动生成缺失的日期和价格从上一个日期为缺失的日期。因此,如果星期五是2013年7月26日,星期六和星期日是27日和28日,那么该表中会缺少27日和28日的日期和价格 因此,在对整个2013年7月的价格进行假脱机时,我应该得到所有日期,对于丢失的日期,例如:27

我有一个表MKT,其中包含以下字段:value\u date、stk\u exch、security、MKT\u price、source、currency、name 不包括星期六、星期日和其他市场假期,每天有500种证券

我需要一个sql自动生成缺失的日期和价格从上一个日期为缺失的日期。因此,如果星期五是2013年7月26日,星期六和星期日是27日和28日,那么该表中会缺少27日和28日的日期和价格

因此,在对整个2013年7月的价格进行假脱机时,我应该得到所有日期,对于丢失的日期,例如:27和28,sql将取26的价格

我正在使用Oracle

value_date   stk_exch    security      mkt_price
-------------------------------------------------    
26/07/2013   BSE         BANKBARODA    565.85   
29/07/2013   BSE         BANKBARODA    585.85   
现在SQL应该返回了

value_date  stk_exch     security      mkt_price
-------------------------------------------------
26/07/2013  BSE          BANKBARODA    565.85   
27/07/2013  BSE          BANKBARODA    565.85   
28/07/2013  BSE          BANKBARODA    565.85   
29/07/2013  BSE          BANKBARODA    585.85   

我将您的_表用作带有outerjoin的一个表,使用最后一个_值插入以前的数据, 看看这个:

SELECT last_value(m.data ignore nulls) over (order by n.mydate) data,
     n.mydate
FROM
     (SELECT DATA, mydate FROM your_table
     ) m,
     (SELECT TRUNC(SYSDATE, 'MM')-1+LEVEL mydate FROM dual CONNECT BY LEVEL <= 30
     )n
WHERE m.mydate(+) = n.mydate
ORDER BY n.mydate;
-编辑-

对于您的数据:

SELECT n.mydate VALUE_DATE,
     last_value(m.STK_EXCH IGNORE NULLS) OVER (ORDER BY n.mydate) STK_EXCH,
     last_value(m.SECURITY IGNORE NULLS) OVER (ORDER BY n.mydate) SECURITY,
     last_value(m.mkt_price IGNORE NULLS) OVER (ORDER BY n.mydate) MKT_PRICE
FROM
     (SELECT VALUE_DATE, STK_EXCH, SECURITY, MKT_PRICE FROM MKT
     ) m,
     (SELECT TRUNC(SYSDATE, 'MM')-1+LEVEL mydate FROM dual CONNECT BY LEVEL <= 30
     )n
WHERE TRUNC(m.VALUE_DATE(+)) = TRUNC(n.mydate)
ORDER BY n.mydate;
或者更具体一点:使用以下内容:

SELECT full_date,
     NVL(stk_exch,last_value(stk_exch IGNORE NULLS)OVER(ORDER BY full_date))stk_exch,
     NVL(security,last_value(security IGNORE NULLS)OVER(ORDER BY full_date))security,
     NVL(mkt_price,last_value(mkt_price IGNORE NULLS)OVER(ORDER BY full_date))mkt_price
FROM
     (SELECT TRUNC(m.vd,'MM')-1+LEVEL FULL_DATE
     FROM
          (SELECT MIN(VALUE_DATE) vd FROM mkt
          WHERE TO_CHAR( value_date, 'MM/YYYY') = TO_CHAR(sysdate-12,'MM/YYYY') -- this line may vary to your requirement
          ) m
     CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(M.VD), 'DD')
     )first_q,
     ( SELECT value_date, stk_exch, SECURITY, mkt_price FROM mkt
     )r
WHERE first_q.full_date = TRUNC(r.value_date(+))
ORDER BY full_date;

你使用的是哪种RDM?嗨,这里有更新的fiddle。对不起,我没有通过这个查询来调整它。你能使用我在查询中提到的字段吗。谢谢你发布了你的数据样本,这样我就可以很容易地编写代码了。嗨,我会尝试一下,然后回复。嗨,阿杰马尔,很抱歉,无法让它工作。这对我来说太复杂了,无法解开并编辑它。任何其他选择,你只需看到小提琴链接,或者考虑每天插入空值,无论它的工作与否。因此,进行查询很容易。
SELECT full_date,
     NVL(stk_exch,last_value(stk_exch IGNORE NULLS)OVER(ORDER BY full_date))stk_exch,
     NVL(security,last_value(security IGNORE NULLS)OVER(ORDER BY full_date))security,
     NVL(mkt_price,last_value(mkt_price IGNORE NULLS)OVER(ORDER BY full_date))mkt_price
FROM
     (SELECT TRUNC(m.vd,'MM')-1+LEVEL FULL_DATE
     FROM
          (SELECT MIN(VALUE_DATE) vd FROM mkt
          WHERE TO_CHAR( value_date, 'MM/YYYY') = TO_CHAR(sysdate-12,'MM/YYYY') -- this line may vary to your requirement
          ) m
     CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(M.VD), 'DD')
     )first_q,
     ( SELECT value_date, stk_exch, SECURITY, mkt_price FROM mkt
     )r
WHERE first_q.full_date = TRUNC(r.value_date(+))
ORDER BY full_date;