根据时间戳(带公差)将两个sqlite表拼接在一起

时间:2016-05-19 22:57:15

标签: python database sqlite datetime join

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

我对此的一般想法是两步:

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

2)在TABLE_B中不存在IF TABLE_A.timestamp,找到下一个最接近的并将该引用时间写入TABLE_A.ref_timestamp

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

我正在尝试做的是(在伪SQLite中):

1)使用TABLE_A.timestamp更新TABLE_A.ref_timestamp,其中timestamp =? IF中的时间戳EXISTS在TABLE_B.timestamp

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

2)UPDATE 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);

1 个答案:

答案 0 :(得分:0)

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);