(Postgre) SQL - присоединение по самой последней дате <= другая дата - PullRequest
0 голосов
/ 26 марта 2019

Учитывая две таблицы, подобные этой

 ; 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.fk   foo.fk
 ------   ------
 1        1
 7        1
 8        1
 21       3
 87       3

Это тесно связано, но не совпадает с Postgresql - получить ближайшую строку datetime относительно заданного значения datetime : которое обращается кзапрос для одной строки, мне нужно сделать соединение.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Вы можете сделать это с боковым соединением:

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;

Вы также можете сделать это с помощью коррелированного подзапроса.Преимущество бокового соединения (в данном случае) заключается в возможности возврата нескольких столбцов.

0 голосов
/ 26 марта 2019

Без объединения:

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)

См. Демоверсию Результаты

fk | fk
-------  
 1 |  1
 7 |  1
 8 |  1
21 |  3
87 |  3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...