我正在尝试获取传感器在过去24小时内引入的所有值的字段pm10_ug_m3的平均值,但是对于我当前的代码,平均值不包括插入的行的值。
当前,由于触发是在插入之前完成的,因此并未考虑到在pm10_ug_m3字段中插入的最后一个值。因此,从(10 + 3)/ 2
字段中引入的平均值为3,而不是6.51)创建表格并添加一些日期:
(
ID bigint NOT NULL,
SensorID character(10),
pm10_ug_m3 numeric(10,2),
tense timestamp without time zone,
average float,
CONSTRAINT id_pk PRIMARY KEY (ID)
);
INSERT INTO sensor (ID,SensorID,pm10_ug_m3,tense) VALUES
(1,'S16',1,'2019-07-10 04:25:59'),
(2,'S20',3,'2017-07-10 02:25:59');
2)创建触发器以计算最近24小时内从同一传感器捕获的记录的pm10_ug_m3的平均值:
CREATE OR REPLACE FUNCTION calculate_avg() RETURNS TRIGGER AS $BODY$
BEGIN
NEW.average := ( SELECT AVG(pm10_ug_m3)
FROM sensor
WHERE SensorID=NEW.SensorID
AND tense>= NEW.tense - INTERVAL '24 HOURS');
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER calculate_avg_trigger BEFORE INSERT OR UPDATE
ON sensor FOR EACH ROW
EXECUTE PROCEDURE calculate_avg();
3)插入新行,将在其中填充字段平均值:
INSERT INTO sensor (ID,SensorID,pm10_ug_m3,tense) VALUES
(3,'S20',10,'2017-07-10 04:25:59')
答案 0 :(得分:1)
这不起作用,因为AVG()
函数仅考虑仍在插入的数据,而不考虑将要插入 的新数据。
将触发点从BEFORE
更改为AFTER
确实可以提供正确的结果,但是由于此时INSERT
已经完成,因此无法设置正确的结果。
获得结果的一种方法是在触发函数中手动计算平均值:
SELECT (SUM(pm10_ug_M3) + NEW.pm10_ug_m3) / (COUNT(pm10_ug_m3) + 1)
FROM ...
SUM()
当前值+新值除以COUNT()
当前值+新值。