2014-06-26 55 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