当前位置: 首页 > 面试题库 >

甲骨文移动平均线

姜智渊
2023-03-14
问题内容

我有一个表(日期,有效负载),其中包含约10年的数据,我想基于14天(2周)和90天(12周)的间隔计算移动平均值(MA),以显示有效负载的趋势

我已经写了这个查询,但是它得到了错误的值

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的工作原理

我可以MA在Excel中进行计算,但是我需要在数据库级别执行此操作,能否请您告诉我如何执行此操作?


问题答案:

我不明白使用的目的是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



 类似资料:
  • Support for the Oracle database. The following table summarizes current support levels for database release versions. 支持的Oracle版本 The following dialect/DBAPI options are available. Please refer to ind

  • 我刚接触oracle forms,遇到了一个问题。我在表单中有两个具有相同字段的多个记录块。 我查询一个块的数据,它被填充。 哪里有一种方法可以将所有行从填充的块复制到“复制”块?

  • 问题内容: 在OracleDoc中没有表达式背后的例子,所以我尝试使用Java语法,这应该在查询后得到任何数字 但是什么也没显示! 问题答案: 出于争论的考虑,REGEXP_SUBSTR也可以工作:

  • Python是否有一个SciPy函数或NumPy函数或模块来计算给定特定窗口的一维数组的运行平均值?

  • 我需要一个特定的业务场景来设置一个实体(不是PK)上的字段,一个序列中的数字(序列必须是最小值和最大值之间的数字) 我这样定义序列: 在Java代码中,我从序列中检索数字,如下所示: 我的问题是: 如果我在一个事务中调用这个“中选择mySequence.nextval”,同时在另一个事务中调用相同的方法(并行请求),那么确定序列返回的值是不同的吗? 不可能从第一个事务中读取未提交的值吗? 因为假设

  • 问题内容: 我正在写一个查询,以查找收入高于其部门平均工资的员工。我需要显示员工ID,薪水,部门ID和该部门的平均工资。 我有一个几乎可以正常使用的查询,但它一直显示“ ORA-00904:“ AVG_SAL”:无效标识符”错误。我正确地做到了吗?为什么会出现此无效的标识符错误? 问题答案: 我不相信您可以在WHERE子句中引用列别名(在这种情况下为avg_sal)。 您需要重复该内部查询,即: