0

感恩节快乐!!

这篇文章仅用于学习和教育目的

表结构、插入语句和 SQL 查询在下面的 db fiddle 链接中进行了更新,以保持这篇文章的简洁明了。请参考以下链接:

db<>小提琴

我正在尝试计算“7 天移动平均线”,并根据这个新列“7 天移动平均线”添加计算列。尝试了不同的方法并收到错误“此处不允许使用窗口功能”。后来在excel电子表格中尝试并得到了公式。仍然不确定如何使用 Match_Recognize 在 SQL 中实现这一点,因此向各位专家寻求帮助。

请注意:我正在上传 excel 和公式的屏幕截图,因为 stackoverflow 没有让我选择上传 excel 电子表格。

以下是我期望的输出(以黄色突出显示的列): 在此处输入图像描述

更新: 感谢您的建议和纠正我。更新了帖子。

棘手的部分:
列“7_MOV_AVG”:第 8 行(根据 excel 序列号)是单元格 E2 到 E8 的平均值,
而第 9 行(根据 excel 序列号)以后的公式考虑了前一行的值,不知道如何实现这一点。下面是计算截图: 在此处输入图像描述

感谢您对此的任何帮助。提前致谢。

谢谢,
里查

4

1 回答 1

1

看起来这是您需要的:https ://dbfiddle.uk/?rdbms=oracle_18&fiddle=611827551a8d454d69a0986ea8c0b2da

with
 rs_fixed as (select stock,to_date(Close_Date,'dd-mm-yyyy') as Close_Date, price from raw_source) 
,pre as (
    SELECT *
    FROM   rs_fixed
    MATCH_RECOGNIZE (
      PARTITION BY stock
      ORDER BY Close_Date
      MEASURES
        COUNT(*) AS match_size,
        CLASSIFIER() AS pttrn
      ALL ROWS PER MATCH
      PATTERN (
        down+  | up+  | other
      )
      DEFINE
        down AS PREV(price) > price,
        up AS  PREV(price) < price
    )
)
select 
    pre.*
   ,avg(price)
        over(
            partition by stock 
            order by Close_Date
            range between 7 preceding and 1 preceding
            ) as "7_mov_avg"

from pre

如您所见,我修复了您的定义-对于日期算术close_date,它不应该是varchar2 。date另外我不知道为什么您将 C2-C9 聚合为单元格 C 8的 avg ,因此我已根据您对前 7 天的描述进行更改,而不是前 5 天和后 1 天,但如果您真的需要它,您可以替换上面的windowsing子句range between 5 preceding and 1 following。最后,如果您只需要在第 7 天之后显示行,则可以使用caseDBFiddle 中最后一个查询的子句。

于 2021-11-25T23:19:50.713 回答