2014-03-04 212 views
3

我有一個包含大約10年數據的表格(日期,有效載荷),並且我想根據14天(2周)和90天計算顯示有效載荷趨勢的移動平均值(MA)天(12周)的時間間隔Oracle移動平均數

我寫此查詢,但它讓我錯誤的價值觀

SELECT x.*, 
    ABS (LTMA-STMA) DIFFERECNE 
FROM 
    (SELECT SDATE, 
    PAYLOAD, 
    AVG(PAYLOAD) OVER (ORDER BY W ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) STMA, 
    AVG(PAYLOAD) OVER (ORDER BY W ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) LTMA 
    FROM 
(SELECT b.*, 
    TO_NUMBER(TO_CHAR(X.SDATE, 'W')) W 
FROM 
    (SELECT TO_DATE(TO_CHAR(a.SDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') SDATE, 
    SUM(a.PAYLOAD) PAYLOAD 
    FROM TABLE_PAYLOAD a 
    WHERE a.SDATE > sysdate - 3 * 365  
    GROUP BY TO_CHAR(a.SDATE, 'YYYY-MM-DD') 
    ORDER BY TO_CHAR(a.SDATE, 'YYYY-MM-DD') 
) b ) 
ORDER BY SDATE 
) x; 

其實我知道什麼是MA,但我不明白甲骨文是如何工作的!

我可以在Excel中計算MA但我需要在數據庫級別執行此操作,請問如何執行此操作?

+0

通過與Windowing子句(列W)中使用的鍵相同的鍵來指定最終的輸出,那麼結果應該更清晰。 –

+0

我認爲你對'W'週數的計算是不正確的。 W給出了一個月的周(1-5),其中第一週在該月的第一天開始,在第七天結束。 – Noel

回答

3

我不明白什麼是使用TO_CHAR(SDATE, 'W')?根據商務部這應該給你的週數在當月...

無論如何,我試圖簡化查詢,希望它仍然適合您的需要:

SELECT x.*, ABS (LTMA-STMA) DIFFERENCE 
FROM 
(
    SELECT SDATE, PAYLOAD, 
     AVG(PAYLOAD) OVER (ORDER BY SDATE rows BETWEEN 14 PRECEDING AND CURRENT ROW) STMA, 
     AVG(PAYLOAD) OVER (ORDER BY SDATE rows BETWEEN 90 PRECEDING AND CURRENT ROW) LTMA 
    FROM 
    (
    SELECT a.SDATE, SUM(a.PAYLOAD) PAYLOAD 
    FROM TABLE_PAYLOAD a 
    WHERE a.SDATE > sysdate - 3 * 365  
    GROUP BY a.SDATE 
) 
) x 
ORDER BY SDATE; 

PS:我不t看TO_DATE(TO_CHAR(a.SDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD'),這相當於a.SDATE ......

+0

我得到這個錯誤*** ORA-00907:缺少右括號00907. 00000 - 「缺少右括號」*原因:*操作:錯誤在行:5列:44 *** – Areff

+0

哦,我使用了在我的內部查詢中使用'ORDER BY' ...我更改了查詢,可以請重試嗎? – Emmanuel

+3

'to_char(a.sdate,...)'應該可以擺脫存儲在日期中的時間部分。使用'trunc(a.sdate)'可以達到同樣的效果,並且會讓我覺得這更明顯。 –