Присоединиться к таблице на основе даты - PullRequest
0 голосов
/ 21 октября 2019

У меня есть две таблицы:

Таблица A

ID | name
---+----------
 1 | example
 2 | example2

Таблица B (created поле равно timestamptz)

ID | id_table_a | dek  | created
---+------------+------+---------------------
 1 |    1       | deka | 2019-10-21 10:00:00
 2 |    2       | dekb | 2019-10-21 11:00:00
 3 |    1       | dekc | 2019-10-21 09:00:00
 4 |    2       | dekd | 2019-10-21 09:40:00
 5 |    1       | deke | 2019-10-21 09:21:00

Мне нужно получитьзаписи из Table A и каждая запись должна иметь последний dek из table b на основе created.

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Я бы использовал боковое соединение, очень часто это быстрее, чем при использовании select max()

select a.*, b.dek
from table_a a
  join lateral (
    select id, id_table_a, dek, created
    from table_b 
    where b.id_table_a = a.id
    order by created desc 
    limit 1
  ) tb on true;

Другой альтернативой является использование distinct on:

select a.*, b.dek
from table_a a
  join lateral (
    select distinct on (id_table_a) id, id_table_a, dek, created
    from table_b 
    order by id_table_a, created desc
  ) tb on tb.id_table_a = a.id;

Зависит отна вашем распределении данных, который быстрее.

0 голосов
/ 21 октября 2019

С CTE возвращением соединенных таблиц и NOT EXISTS:

with cte as (
  select a.id, a.name, b.dek, b.created
  from tablea a inner join tableb b
  on b.id_table_a = a.id
)
select t.* from cte t
where not exists (
  select 1 from cte
  where id = t.id and created > t.created
) 
...