Как при join избавиться от дублирующихся записей?

Есть таблица order.
Есть timeline(там есть fk - order_id).

SELECT o.id,
           o.status,
           order_payment_at,
           order_cancel_at,
           ....
          FROM orders AS o
          INNER JOIN partners p ON p.id = o.partner_id
          ....
          INNER JOIN(
            SELECT
              DISTINCT order_id, 
              CASE WHEN data LIKE '%{"status":"paid"}%' THEN created_at END AS order_payment_at,
              CASE WHEN data LIKE '%{"status":"cancel"}%' THEN created_at END AS order_cancel_at
              ....
              FROM timeline
          ) timeline ON timeline.order_id = o.id
         GROUP BY o.id and long list.......

проблема в чем - к order относится дофигища timeline.
и запрос мне выводит:
id(имеется ввиду order)
1 что относится к timeline
1 что относится к timeline
1 что относится к timeline

запрос правильно всё выводит, но нужно чтоб ВСЕ данные с timeline были в ОДНОЙ строке.
Понимаю что мне нужно GROUP BY order_id, но postgres не хочет ограничиваться только order_id - он еще хочет приплести
и data и created_at

Всем спасибо за ответы
  • Вопрос задан
  • 2787 просмотров
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
тем или иным образом использовать distinct или group by
Ответ написан
MAGratsk
@MAGratsk
запрос правильно всё выводит, но нужно чтоб ВСЕ данные с timeline были в ОДНОЙ строке.

Так все-таки правильно или нет? Не совсем ясно, что вы хотите получить на выходе.
Чтобы на каждый order было не больше одного timeline? Или чтобы на каждый order выводились данные по всем timeline, но в каком-то агрегированном виде? Если так, то вопрос в каком виде.

Так или иначе, когда после джойна нужно отбросить дубликаты и оставить только одну результирующую строку на каждую исходную строку, отлично подходит конструкция:
Dedup = ROW_NUMBER() OVER (PARTITION BY o.id ORDER BY ...).
Следующим шагом - подзапросом или через CTE - устанавливается фильтр на Dedup = 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы