2014-03-04 173 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)'可以达到同样的效果,并且会让我觉得这更明显。 –