【问题标题】:Delete rows in one minute intervals with Postgresql使用 Postgresql 每隔一分钟删除行
【发布时间】:2014-06-26 14:50:58
【问题描述】:

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

【问题讨论】:

  • 你能举出时间戳的例子吗?
  • 如果每个 SENSOR_ID 每分钟有多个插入,您希望保留哪一个?最新的?
  • @youngthing 我认为 OP 想要那些发生在 00 年代的事情。 Sergi,您不想对这些值进行平均以减少噪声、异常值影响等,而不是仅仅丢弃这些值吗?
  • 时间戳看起来像这样:“2014-05-13 15:38:13.025+02”。我不想取平均值,我想保留每分钟的第一个值,这可能取决于传感器的不同时间(并非所有传感器同时发送值)。

标签: sql postgresql


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    修剪功能会去除多余的部分,如果您不小心,可能会很昂贵。仅在插入数据时运行,仅在数据包含的分钟和 SENSOR_ID 范围内运行,限制了速度范围。

    像这样创建触发器:

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

    使用您的首选语言创建函数,例如plpgsql。

    【讨论】:

    • 感谢您的回复。这是我将来可以实现的东西,但我正在寻找的答案已由 Clodoaldo Neto 提供。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2011-03-28
    • 2019-10-03
    相关资源
    最近更新 更多