【问题标题】:Oracle moving average甲骨文移动平均线
【发布时间】: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 周从该月的第一天开始,到第七天结束。

标签: sql oracle


【解决方案1】:

我不明白使用 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:我也看不出做TO_DATE(TO_CHAR(a.SDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')的意义,这相当于a.SDATE...

【讨论】:

  • 我收到此错误 *** ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因:*操作:第 5 行错误 列:44 ***
  • 哦,抱歉,我在内部查询中使用了ORDER BY...我更改了查询,您可以重试吗?
  • to_char(a.sdate, ...) 可能应该去掉存储在日期中的时间部分。使用trunc(a.sdate) 可以达到同样的效果,我认为这会更明显。
猜你喜欢
  • 2017-09-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2011-06-29
  • 2019-04-24
  • 2012-05-24
  • 2021-01-18
相关资源
最近更新 更多