表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
)应该在附近。我想根据附近的时间戳关联sn1
和id
。
答案 0 :(得分:3)
“附近”相当模糊
要加入table2
,timee
将在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
但要注意大数据集