(Postgre)SQL-按最新日期<=另一个日期加入

时间:2019-03-26 13:03:46

标签: sql postgresql date join

给出两个这样的表

 ; 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密切相关,但不相同:该地址针对单个行的查询,我需要进行连接。

2 个答案:

答案 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