【发布时间】:2019-03-28 12:57:17
【问题描述】:
我想为 postgresql 表设置一个触发器函数,它应该使用从另一列派生的数据更新一列。
表:
CREATE TABLE day (
symbol varchar(20) REFERENCES another_table(symbol),
date date,
open NUMERIC(8,2),
high NUMERIC(8,2),
low NUMERIC(8,2),
close NUMERIC(8,2),
sma8 NUMERIC(8,2),
PRIMARY KEY(symbol, date));
注意:复合主键。
样本插入:
INSERT INTO day VALUES('ABC', '2019-03-19', 102.3, 110.0, 125.3, 120.4, 0);
INSERT INTO day VALUES('ABC', '2019-03-20', 112.3, 109.0, 119.3, 118.4, 0);
INSERT INTO day VALUES('DEF', '2019-03-19', 1112.3, 1100.0, 1155.3, 1120.4, 0);
INSERT INTO day VALUES('DEF', '2019-03-20', 1202.3, 1180.0, 1205.3, 1190.4, 0);
等等。
当“日期”列是唯一的主键并且表仅包含与一个“符号”相关的数据(即表包含不同唯一日期的一个特定符号的数据)时,以下触发函数可以正常工作。
create or replace function update_sma8() RETURNS TRIGGER AS
$$
BEGIN
UPDATE day d SET sma8 = s.simple_mov_avg
FROM
(
SELECT sec.date,AVG(sec.close)
OVER(ORDER BY sec.date ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS
simple_mov_avg FROM day sec
)s where s.date = NEW.date --The newly inserted date
AND d.date = s.date;
RETURN NULL;
END $$ language plpgsql;
参考:SQL trigger function to UPDATE daily moving average upon INSERT
我想用通过平均当前'close'值和一个特定符号的最后7个'close'值得出的值更新'sma8'列('date'变化,即过去的数据。)。其他符号也是如此。
请指导我。谢谢。
【问题讨论】:
-
存储可以计算的东西通常是个坏主意。它引入可能性,例如不正确,如果您按需运行计算,则不存在这些可能性。
标签: sql postgresql