给出两个这样的表
; table foo
fk date
-- ----
1 2017-01-01 02:00:00
2 2017-01-01 04:00:00
3 2017-01-01 06:00:00
; table bar
fk date
-- ----
1 2017-01-01 02:05:00
7 2017-01-01 02:20:00
8 2017-01-01 03:57:00
21 2017-01-01 06:51:00
87 2017-01-21 12:00:00
如何编写将表'bar'的每一行映射到表'foo'的行且其最新时间戳小于或等于'bar'中的时间戳的联接?换句话说,理想的结果是
bar.fk foo.fk
------ ------
1 1
7 1
8 1
21 3
87 3
这与Postgresql - get closest datetime row relative to given datetime value密切相关,但不相同:该地址针对单个行的查询,我需要进行连接。
答案 0 :(得分:1)
您可以通过横向联接来做到这一点:
select b.*, f.fk
from bar b left join lateral
(select f.*
from foo f
where f.date <= bar.date
order by f.date desc
fetch first 1 row only
) f
on true;
您也可以使用相关子查询来执行此操作。横向连接(在这种情况下)的优点是能够返回多列。
答案 1 :(得分:0)
没有加入:
select b.fk,
(select f.fk from foo f where date = (
select max(date) from foo where date <= b.date
)
) fk
from bar b
或具有联接:
select b.fk, f.fk
from bar b inner join foo f
on f.date = (select max(date) from foo where date <= b.date)
请参见demo
结果
fk | fk
-------
1 | 1
7 | 1
8 | 1
21 | 3
87 | 3