【发布时间】: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