2014-06-26 38 views
0

在PostgreSQL数据库中有一个非常大的表,包含3列:SENSOR_ID,VALUE,TIMESTAMP。每5秒我有一个值用于不同的SENSOR_ID。我想以这样的方式删除行,即我每分钟保持1 VALUE每SENSOR_ID。这样我可以显着减小表格的大小。用Postgresql以一分钟的时间间隔删除行

+0

你能举出时间戳的例子吗? – SQLChao

+0

如果您每分钟有多个SENSOR_ID插入,您希望保留哪一个?最近的? – youngthing

+0

@youngthing我认为OP想要在00s发生的那些。塞吉,你不想平均这些价值观来减少噪音,异常值的影响等,而不是仅仅丢弃那些? – mlt

回答

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 
+0

它工作,谢谢。 – sergi

0

这里最有效的策略是创建一个函数来修剪当前分钟的多余部分,并在每次插入数据时执行该函数。

如果你不小心,修剪功能可以消除过量,并且可能会很贵。只有在插入数据时才运行它,仅在分钟和数据中包含的SENSOR_ID限制速度范围。

像这样创建触发器:

CREATE TRIGGER triggername 
BEFORE INSERT OR UPDATE ON tablename 
FOR EACH ROW 
EXECUTE PROCEDURE functionname 

使用您的首选语言创建功能,例如PLPGSQL。

+0

谢谢你的回复。这是我将来可以实施的事情,但我期待的答案是由Clodoaldo Neto提供的。 – sergi