根据附近的时间戳加入两个表

时间:2015-03-03 18:42:05

标签: 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

表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

我想将这两个表(使用左连接)与附近的时间戳联系起来。 table1是第一步,table2是生产过程的第二步。

在我想要的表格中,dateee(来自table1)和timee(来自table2)应该在附近。我想根据附近的时间戳关联sn1id

2 个答案:

答案 0 :(得分:3)

“附近”相当模糊 要加入table2timee将在dateee之后的10秒内加入:

SELECT *
FROM   table1 t1
LEFT   JOIN table2 t2 ON t2.timee BETWEEN t1.dateee
                                      AND t1.dateee + interval '10 sec';
  • 即使LEFT JOIN中没有匹配,table1也会在结果中保留table2的行。

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

替代

table1中的每一行连接到具有下一个更高时间戳的行。 <{1}}上每行的结果中只有行:

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; 上的索引对性能至关重要。

答案 1 :(得分:0)

也许这样的事情会起作用

select * 
from 
    Table1 t1, 
    Table2 t2,
    (select 
        a.*, 
        row_number() over (partition by a.sn1 order by a.mt) rn
    from
        (select 
            q.sn1, 
            w.id id, 
            min(abs(q.dateee - w.timee)) mt
        from 
            Table1 q, 
            Table2 w 
        group by q.sn1, w.id
        ) a
    ) mysort
where 
mysort.rn = 1 and mysort.sn1 = t1.sn1 and mysort.id=t2.id

但要注意大数据集