【问题标题】:SQL timeseries inserts with ability to update known observationsSQL 时间序列插入能够更新已知观察值
【发布时间】:2021-12-12 11:05:55
【问题描述】:

我正在试验时间序列,并将数据放在 Postgres 数据库表中,如下所示:

CREATE TABLE IF NOT EXISTS public.time_series(
id integer NOT NULL,
datetime timestamp with time zone NOT NULL,
value real NOT NULL,
edit_datetime timestamp with time zone NOT NULL DEFAULT now())

现在,当我从 Python 插入数据时,我会创建一个临时表并将其插入到不存在此观察结果的主表中。

INSERT INTO time_series(id, datetime, value) 
            SELECT temp_time_series.id, temp_time_series.datetime, temp_time_series.value
            FROM temp_time_series
WHERE NOT EXISTS (
            SELECT 'X' 
            FROM time_series
                 WHERE temp_time_series.id = time_series.id
                 AND temp_time_series.datetime = time_series.datetime
                 AND temp_time_series.value = time_series.value)"""

它似乎运行得非常快,这是它所需要的。

如果我只想用新值更新时间序列观察并更新编辑时间戳,而不是插入新行,该怎么办? 我没有任何主键,有时我需要使用旧版本的 DateTime 但具有不同的 edit_datetimes。所以我不知道它是否适用于创建基于 id 和 DateTime 的约束,我也不知道该怎么做或如何编辑代码来处理。

有人有什么建议吗?

BR

【问题讨论】:

  • 你需要一种方法来识别行,并且每个表都应该有一个主键。
  • 感谢关于主键@LaurenzAlbe 的评论我已经阅读了更多关于为什么这是一个好主意的内容。在能够插入同一时期的数据并更新该时期的观察方面,我仍然有一些麻烦。

标签: sql postgresql timescaledb


【解决方案1】:

Here 是向您展示如何添加索引的好资源。

您还可以查看upsert 的工作原理,并将ON CONFLICT 子句与索引一起使用。

INSERT INTO time_series VALUES (...)
  ON CONFLICT (time, id) DO UPDATE
  SET value = excluded.value;

【讨论】:

  • Ahhh 但带有 (datetimetime, id) 索引。我将无法添加具有相同 id 和日期时间(但不同的 edit_datetime 和值)的另一行,并且我希望能够在更新日期时间、id 组合存在和插入新行之间选择插入尽管有日期时间,但具有不同的值和 edit_datime,id 已经存在
  • 是否会将`ON CONFLICT (time, id) DO UPDATE` 更改为`ON CONFLICT (time, id, edit_datetime) DO UPDATE` 正确处理它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2021-10-26
  • 2019-03-23
相关资源
最近更新 更多