Проблема: У меня есть таблица, в которой есть несколько строк с одинаковым кодом, но с разной датой, у меня также есть запрос:
SELECT * FROM movies WHERE CODE IN ('action', 'comedy')
Вопрос: Как я могу вернуть строку с последней датой ДЛЯ КАЖДОГО кода в списке и ограничить ее до 1, поскольку могут быть дубликаты:
поэтому он возвращает только ID 1 и 4.
Что-то типа
SELECT * FROM movies WHERE CODE IN ('action', 'comedy') DESC LIMIT 1
но для каждого кода.
Спасибо.
В Postgres используйте DISTINCT ON
:
SELECT DISTINCT ON (CODE) m.*
FROM movies m
WHERE m.CODE IN ('action', 'comedy')
ORDER BY m.CODE, m.start_date DESC;
DISTINCT ON
— это расширение Postgres. Он возвращает набор результатов с одной строкой на уникальную комбинацию значений выражений в круглых скобках (например, в этом отношении клавиши GROUP BY
). Конкретная строка определяется предложением ORDER BY
. Уникальные ключи идут первыми, а остальные ключи определяют, «какая» строка.
SELECT code, MAX(start_date)
FROM movies
GROUP BY code
Это не вернет поле id (или поля, отличные от code и start_date). OP запрашивает SELECT *, так что это не сработает :(