Присоединяйтесь один-ко-многим, верните минимальный результат больше чем - PullRequest
1 голос
/ 20 февраля 2020

Я знаю, что заголовок сложный, но вот ситуация:

У меня есть таблица таких пользователей:

 id     opened_at                
 32o   2/01/2018 00:00:00       

И таблица групп пользователей, подобная этой:

 user_id     group_id
  32o         29834jb

И полная таблица таких групп:

 group_id               group_ended_at
 29834jb               1/14/2018 00:00:00
 29834jb               2/14/2018 00:00:00
 29834jb               3/14/2018 00:00:00
 29834jb               4/14/2018 00:00:00

Я хочу присоединить группы к пользователям, но вернуть только минимальное group_ended_at, которое больше чем opened_at дата для пользователя.

Другими словами, я хочу получить такой результат:

id           opened_at              group_id              group_ended_at
32o         2/01/2018 00:00:00       29834jb            2/14/2018 00:00:00

Как бы я go об этом?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Мы можем опираться на вашу попытку: просто добавьте условие неравенства даты в условия объединения, определите правильное предложение group by, и вы здесь:

SELECT u.id, u.opened_at, u.group_id, MIN(g.group_ended_at)
FROM users u
LEFT JOIN groups g
    ON  u.group_id = g.group_id
    AND g.group_ended_at > u.opened_at
GROUP BY u.id, u.opened_at, u.group_id
0 голосов
/ 20 февраля 2020

Это отвечает на вопрос, который был первоначально задан.

Мне нравится боковое соединение для этого:

SELECT u.*, g.group_ended_at
FROM users u LEFT JOIN LATERAL
     (SELECT MIN(g.group_ended_at) as group_ended_at
      FROM groups g
      WHERE u.group_id = g.group_id AND g.group_ended_at > u.opened_at
     ) g;
...