繁体   English   中英

Oracle SQL 或 PL/SQL:在 MATCH_RECOGNIZE 中添加不同计算的多个列

[英]Oracle SQL or PL/SQL: Add multiple columns in MATCH_RECOGNIZE with different calculations

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

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

db<>小提琴

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

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

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

下面的屏幕截图显示了新列(J、K 和 L 列)的公式:这里第 8 行是前几行的平均值,而第 9 行往前有前几行的级联公式。 在此处输入图像描述

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

谢谢,
里查

看起来这是您需要的: 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的定义 - 对于日期算术,它应该是date而不是 varchar2。 另外我不知道为什么您将 C2-C9 聚合为单元格 C 8的平均值,所以我根据您的描述更改了前 7 天,而不是前 5 天和后 1 天,但如果您真的需要它,您可以替换上面的 windowsing 子句的range between 5 preceding and 1 following 最后,如果您只需要在第 7 天后显示行,您可以使用 DBFiddle 中最后一个查询的case子句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM