【发布时间】:2014-09-05 02:14:27
【问题描述】:
我正在尝试通过匹配时间戳字段(正负一秒)来连接两个表。
SELECT t1.id, t2.id
FROM ctc.table1 t1
INNER JOIN ctc.table2 t2
ON EXTRACT(EPOCH FROM t1.timestamp)
BETWEEN EXTRACT(EPOCH FROM t2.timestamp) - 1
AND EXTRACT(EPOCH FROM t2.timestamp) + 1
有没有更高效的方式来编写这个查询?
【问题讨论】:
-
是否存在多个匹配项?你能把 epoch 分成 3 秒的间隔然后这样比较吗?
-
不,因为如果一个距离“三秒纪元”稍早和稍晚,那么两条非常接近的记录将不匹配。
-
我对 PostgreSQL 不太熟悉,但我知道它有 LATERAL JOIN(类似于 SQL Server 中的 APPLY 概念)。你不能用那个吗?类似(伪代码)“FROM ctc.table1 t1 LATERAL(SELECT ... FROM table2 t2 WHERE t2.timestamp between t1.timestamp - 1 和 t1.timestamp + 1)?
-
顺便说一句,我会使用
ON t1."timestamp" BETWEEN t2."timestamp" - INTERVAL '1' SECOND AND t2."timestamp" + INTERVAL '1' SECOND;,但这主要是装饰性的。 -
使用索引。不要将数据包装在杀死索引使用的函数中,即't2.timestamp - INTERVAL '1' SECOND' 将使用索引,'EXTRACT(EPOCH FROM t2.timestamp) - 1' 不会。
标签: sql performance postgresql