【发布时间】:2014-03-04 08:25:17
【问题描述】:
我有一个表(日期,有效负载),其中包含大约 10 年的数据,我想计算移动平均值 (MA) 以显示基于 14 天(2 周)和 90 天(12周)间隔
我已经写了这个查询,但它得到了错误的值
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是什么,但是我不明白Oracle是怎么工作的!
我可以在 Excel 中计算 MA,但我需要在数据库级别执行此操作,您能告诉我如何执行此操作吗?
【问题讨论】:
-
按照 Windowing 子句(W 列)中使用的相同键对最终输出进行排序,然后您的结果应该会更清晰。
-
我认为您计算的“W”周数不正确。 W 给出每月的第几周 (1-5),其中第 1 周从该月的第一天开始,到第七天结束。