【问题标题】:Stiching together two sqlite tables based on timestamp (with tolerances)根据时间戳(带公差)将两个 sqlite 表拼接在一起
【发布时间】:2016-05-19 22:57:14
【问题描述】:

给定来自两个不同现实生活来源(带有时间戳)的两个 sqlite 信息表。我正在尝试根据最接近的时间戳将 TABLE_A 和 TABLE_B 拼接在一起。我希望以某种方式执行此操作,以便以后的查询(连接)“快速”。

我的总体思路是两个步骤:

1) 查找两个表中都存在的时间戳,并使用该时间戳更新参考列 (TABLE_A.ref_timestamp)。

2) 如果 TABLE_A.timestamp 在 TABLE_B 中不存在,则查找下一个最接近的时间并将该参考时间写入 TABLE_A.ref_timestamp

  • 两个表都有一个 unix 纪元时间戳作为列

我想要做的是这个(在伪 SQLite 中):

1) 使用 TABLE_A.timestamp 更新 TABLE_A.ref_timestamp,其中 timestamp=?如果 TABLE_B.timestamp 中存在时间戳

  • 显然这不起作用,因为 SQLite 中不存在“IF”

2) 更新 TABLE_A.ref_timestamp WHERE timestamp=? WITH(SELECT FROM TABLE_B WHERE datetime BETWEEN ?+tolerance AND ?-tolerance ORDER BY ABS(?-datetime) LIMIT 1)

  • 这里的想法是使用 BETWEEN 进行粗略切割,然后选择该范围内最接近的一个,如果没有找到 NULL 也可以。
  • 由于缺少“WITH”,这不起作用
  • 容差将作为配置给出

我的解决方案要么不起作用,要么受到语法错误的困扰,我想知道 SO 中是否有人遇到过这个问题并有一些见解。

用例子编辑:

TABLE_A:
(timestamp,ref_timestamp)
123.0,NULL
124.0,NULL
125.0,NULL
8000.0,NULL

TABLE_B
(timestamp)
122.5
124.0
125.0

运行“zippering”后,TABLE_A 将包含以下内容:

TABLE_A:
123.0,122.5
124.0,124.0
125.0,125.0
8000.0,NULL

感谢 CL 提供的解决方案。它缺少一个“table_b”。在 ABS 函数中:

UPDATE table_a
SET ref_timestamp = (SELECT timestamp
                 FROM (SELECT timestamp,
                              abs(table_b.timestamp - table_a.timestamp) AS diff
                       FROM table_b
                       WHERE timestamp BETWEEN table_a.timestamp - 42 AND table_a.timestamp + 42)
                 ORDER BY diff
                 LIMIT 1);

【问题讨论】:

  • 我应该提到这是在 python 程序中完成的。

标签: python database sqlite datetime join


【解决方案1】:

WITH 自 SQLite 3.8.3 起可用。

无论如何,这可以通过使用正确的 SQL 语法和 correlated subquery: 来完成:

UPDATE table_a
SET ref_timestamp = (SELECT timestamp
                     FROM (SELECT timestamp,
                                  abs(timestamp - table_a.timestamp) AS diff
                           FROM table_b
                           WHERE timestamp BETWEEN table_a.timestamp - 42 AND table_a.timestamp + 42)
                     ORDER BY diff
                     LIMIT 1);

【讨论】:

  • 以上运行后,table_a.ref_timestamp 中的结果总是比 table_a.timestamp 少 42。即:123.0 81.0; 124.0 82.0table_b 中存在 81 和 82 的值。这可能是由于 ORDER BY diff 命令造成的吗?
猜你喜欢
  • 2020-04-03
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
相关资源
最近更新 更多