2013-07-30 79 views
3

我有一個表MKT,其中包含以下領域value_date,stk_exch,security,mkt_price,source,currency,name 說500日證券的每一天(不包括週六和週日和其他市場假日)。SQL自動生成缺失日期和價格從012日期前缺失的日期

我需要一個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 
+2

您使用哪種關係數據庫管理系統? – Gidil

+0

嗨,看到更新的提琴這裏http://sqlfiddle.com/#!4/9fbaf/3/0 – ajmalmhd04

回答

3

我用your_table作爲一個表outerjoin,如用於last_value插入之前的數據, 看看這:) :)

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; 

fiddle here

你可以使用lag()功能還可以,但如果日期差距不止一個也不會填寫的數據,它只是填補以前的即時數據,

nvl(m.data, lag(m.data)over(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; 

see fiddle here

+0

對不起,我沒有完全得到這個查詢來調整它。你可以使用我在查詢中提到的字段嗎?謝謝 – user2630322

+0

您可以發佈您的數據樣本,以便我可以輕鬆製作代碼。 – ajmalmhd04

+0

嗨Ajmal,我已編輯我的帖子,包括樣本數據 – user2630322