使用Postgresql以一分钟的间隔删除行

时间:2014-06-26 14:50:58

标签: sql postgresql

我在PostgreSQL数据库中有一个非常大的表,有3列:SENSOR_ID,VALUE,TIMESTAMP。对于不同的SENSOR_ID,我每5秒钟有一个值。我希望以这样一种方式删除行,即每分钟每个SENSOR_ID保持 1 VALUE 。这样我就可以大大减小表格的大小。

2 个答案:

答案 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。