Выберите первый ряд левого соединения - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь сделать левое соединение. Но я хочу только первую строку объединенной таблицы.

Когда я делаю:

SELECT DISTINCT
  c.reference
FROM contracts as c

вывод : 7400 строк

Но когда я попробуйте выполнить левое соединение. У меня много дубликатов.

Я уже пытался получить только первый ряд, но он не работает. Вот мой код:

SELECT DISTINCT
  c.reference,
  contract_premiums.start_date
FROM contracts as c
LEFT OUTER JOIN contract_premiums ON contract_premiums.contract_id=(
  SELECT contract_id FROM contract_premiums
  WHERE contract_premiums.contract_id = c.id
  ORDER BY contract_premiums.created_at ASC 
  LIMIT 1)

вывод : 11500 строк


Обратите внимание на базу данных в Postgresql, и я использую этот запрос в klipfolio.

1 Ответ

1 голос
/ 20 апреля 2020

Если вам нужна только последняя start_date на reference, вы можете использовать агрегацию:

select c.reference, max(cp.start_date) max_start_date
from contracts c
left join contracts_premiums cp on cp.contract_id = c.id
group by c.reference

Это гарантирует, что вы получите только одну строку на reference.

Если вам нужно больше столбцов из contracts_premiums или если вы хотите отсортировать по столбцу, отличному от start_date (возможно, вы хотите вместо created_at), тогда другой вариант - distinct on:

select distinct on (c.reference) c.reference, cp.start_date, cp.created_at
from contracts c
left join contracts_premiums cp on cp.contract_id = c.cid
order by c.reference, cp.created_at desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...