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)
我想用附近的时间戳连接这两个表(使用左连接)。
table1是table2生产过程的第一步和第二步。
在我想要的表中 dateee(from table1) 和 timee(from table2) 应该非常接近。我想关联sn1并id基于附近的时间戳。
“附近”比较模糊。
要在未来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)性能至关重要。