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

SQL触发功能可在插入时更新每日移动平均值

阳俊德
2023-03-14
问题内容

我正在尝试创建一个SQL触发函数,当将数据插入表中时,该函数应该更新列。该更新基于被插入的值中存在的值。

我有下表存储股票的每日OHLC数据。

CREATE TABLE daily_ohlc (
 cdate date,
 open numeric(8,2),
 high numeric(8,2),
 low numeric(8,2),
 close numeric(8,2),
 sma8 numeric(8,2)
);

INSERT命令:

INSERT INTO daily_ohlc (cdate, open, high, low, close) 
 values ('SYMBOL', 101, 110, 95, 108);

当执行此命令时,我想基于当前值“ INSERTed”和表中已有的值来更新“ sma8”列。

到目前为止,我正在使用以下SQL查询来计算每一行的值,然后使用结果使用python更新“ sma8”列。

SELECT sec.date, AVG(sec.close) 
 OVER(ORDER BY sec.date ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS 
simple_mov_avg FROM daily_ohlc sec;

上面的查询计算最后8条记录(包括当前行)的简单移动平均线。

使用此过程,每次插入数据时,都会更新“ sma8”列中的每一行数据。我想通过使用触发器仅更新最后一行(即正在插入的行)。这该怎么做?


问题答案:

您可以UPDATE FROM在触发器中使用适当的联接来进行选择查询。

create or replace function update_sma8() RETURNS TRIGGER AS
$$
 BEGIN

UPDATE daily_ohlc d SET sma8 = s.simple_mov_avg 
FROM
(
 SELECT  sec.cdate,AVG(sec.close)  
   OVER(ORDER BY sec.cdate ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS 
    simple_mov_avg FROM daily_ohlc sec
)s where s.cdate = NEW.cdate  --The newly inserted cdate
     AND d.cdate = s.cdate;   
RETURN NULL;

END $$ language plpgsql;

使用此方法的唯一警告是,如果有人 删除 行或 更新
close列,则必须重新计算值,而对于现有行则不会发生。只有插入的行会看到正确的重新计算值。

取而代之的是,您可以简单地创建View以在需要时sma8从主表为所有行计算列。



 类似资料:
  • 我创建了一个用于插入和更新的SQL触发器,它基本上执行以下操作: 从插入的表中获取LineID(表的PrimaryID)和RegionID,并将其存储在INT变量中。然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录。 我的问题是,它没有更新记录,我猜,这是因为记录还没有插入到PurchaseOrderLine表中,我正在

  • 问题内容: 所以我有两个这样的桌子… 我正在尝试创建一个触发器,该触发器将: 更新时被更新。 为了进一步使事情复杂化, 如果在when 更新中不存在,我想将其插入并设置为1。 我一直在寻找类似的问题: 1. 在使用自动增量字段插入触发器之前/之后,以及 2. 使用触发器来更新另一个数据库中的表以 尝试将2.合并在一起。这是我到目前为止的内容: 任何建议和指示,我们将不胜感激。或者可能是我忽略的另一

  • 问题内容: 我正在尝试为我的表创建一个触发器,该触发器根据某个标志设置为“ Y”的时间自动添加发布日期 我没有创建触发器的丰富经验,但到目前为止,这是我所拥有的 更新列时出现此错误 触发器“ USER.ADD_CREATE_DT”无效且重新验证失败 有任何想法吗? 谢谢 问题答案: 使用WHEN子句: 或使用IF: 在这种情况下,WHEN更合适,更有效。

  • 问题内容: 当表中的 任何 列更新时,我想在历史表中插入一行。 我只是想捕获列名,旧值和新值。 我希望此触发器尽可能重用,因为我将在其他表上使用相同的概念。 我熟悉触发器以及如何捕获某一列上的更新。我特别在寻找如何编写 一个 触发器,以将一条记录插入到历史记录表中,以获取历史记录表的对应表中已更新的 任何 列。 编辑1 我已经指出 NOWHERE 在我的职位,我在寻找源代码,这样任何人耻辱,dow

  • 问题内容: 我有一个表orderDetails,其中包含订单的产品 productId color size quantity 和一桌股票 productId size color stock 订单完成后,我将使用此查询在表格中插入商品 然后我在表上有一个触发器: 通过此触发器,我想减少库存,但是只有第一个产品受到影响,其他数量保持不变。 我想念什么? 谢谢你。 问题答案: 要点是:您假设将为插入

  • 问题内容: 有没有一种方法可以在oracle中平均多个日期?平均没有任何好处。 谢谢。 问题答案: “平均日期”的定义是主观的,但是您可以将日期转换为儒略数字,然后将其平均,四舍五入,然后转换回日期。