我在PostgreSQL数据库中有一个非常大的表,有3列:SENSOR_ID,VALUE,TIMESTAMP。对于不同的SENSOR_ID,我每5秒钟有一个值。我希望以这样一种方式删除行,即每分钟每个SENSOR_ID保持 1 VALUE 。这样我就可以大大减小表格的大小。
答案 0 :(得分:0)
delete from t
using (
select
sensor_id,
date_trunc('minute', "timestamp") as "minute",
min((extract(epoch from "timestamp") / 12)::integer * 12) as "epoch"
from t
group by sensor_id, 2
) s
where
sensor_id = s.sensor_id
and
date_trunc('minute', "timestamp") = s.minute
and
extract(epoch from "timestamp") / 12)::integer * 12 != s.epoch
答案 1 :(得分:0)
这里最有效的策略是创建一个函数来修剪当前分钟的多余部分,并在每次插入数据时执行该函数。
修剪功能可以消除多余的功能,如果您不小心,可能会很昂贵。仅在插入数据时运行它并且仅在分钟和数据包含的SENSOR_ID时运行它限制了速度范围。
像这样创建触发器:
CREATE TRIGGER triggername
BEFORE INSERT OR UPDATE ON tablename
FOR EACH ROW
EXECUTE PROCEDURE functionname
使用您的首选语言创建该功能,例如PLPGSQL。