根据附近的时间戳连接两个表

Cha*_*ti 1 sql postgresql timestamp left-join

表 1(1422 行)

 sn1     |       dateee        | shift | linee
---------+---------------------+-------+-------
 8419404 | 2015-02-27 09:45:50 | D     |     2
 8419383 | 2015-02-27 09:46:10 | D     |     2
 8419410 | 2015-02-27 09:46:40 | D     |     2
 8419385 | 2015-02-27 09:50:40 | D     |     2
 8419412 | 2015-02-27 09:50:50 | D     |     2
 8419390 | 2015-02-27 09:51:30 | D     |     2
 8419414 | 2015-02-27 09:52:00 | D     |     2
 8419387 | 2015-02-27 09:52:20 | D     |     2
 8419416 | 2015-02-27 09:52:50 | D     |     2
 8419394 | 2015-02-27 09:57:10 | D     |     2
Run Code Online (Sandbox Code Playgroud)

表 2(824 行)

id    | id2 |        timee
------+-----+---------------------
 1302 |     | 2015-02-27 09:46:11
 1303 |     | 2015-02-27 09:46:36
 1304 |     | 2015-02-27 09:50:37
 1305 |     | 2015-02-27 09:51:06
 1306 |     | 2015-02-27 09:51:31
 1307 |     | 2015-02-27 09:51:55
 1308 |     | 2015-02-27 09:52:20
 1309 |     | 2015-02-27 09:52:45
 1310 |     | 2015-02-27 09:57:05
Run Code Online (Sandbox Code Playgroud)

我想用附近的时间戳连接这两个表(使用左连接)。 table1table2生产过程的第一步和第二步。

在我想要的表中 dateee(from table1) 和 timee(from table2) 应该非常接近。我想关联sn1id基于附近的时间戳。

Erw*_*ter 8

“附近”比较模糊。
要在未来10 秒内加入table2where 位置:timeedateee

SELECT *
FROM   table1 t1
LEFT   JOIN table2 t2 ON t2.timee BETWEEN t1.dateee
                                      AND t1.dateee + interval '10 sec';
Run Code Online (Sandbox Code Playgroud)
  • LEFT JOIN从保持行table1的结果,即使没有比赛的table2

  • 可以有多个匹配项,因此可以以各种组合多次返回基表中的每一行。

选择

将每一行加入table1到具有下一个更高时间戳的行中。结果中每行正好一行table1

SELECT *
FROM   table1 t1
LEFT   JOIN LATERAL (
   SELECT *
   FROM   table2 t2
   WHERE  t2.timee >= t1.dateee
   ORDER  BY t2.timee
   LIMIT  1
   ) ON TRUE;
Run Code Online (Sandbox Code Playgroud)

索引对(timee)性能至关重要。