[英]Oracle SQL or PL/SQL: Add multiple columns in MATCH_RECOGNIZE with different calculations
这篇文章仅用于学习和教育目的
表结构、插入语句和 SQL 查询在下面的 db fiddle 链接中更新,以保持这篇文章的简洁和简短。 请参考以下链接:
我正在尝试计算“7 天移动平均线”,并根据这个新列“7 天移动平均线”添加计算列。 尝试了不同的方法并收到错误“此处不允许使用窗口功能”。 后来在 excel 电子表格中尝试并得到了公式。 仍然不确定如何使用 Match_Recognize 在 SQL 中实现这一点,因此向各位专家寻求帮助。
请注意:我正在上传 excel 和公式的屏幕截图,因为 stackoverflow 没有让我选择上传 excel 电子表格。
下面的屏幕截图显示了新列(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.