PostgreSQL DISTINCT ON: последняя строка каждой группы
DISTINCT ON оставляет одну строку на значение группы. Сортируйте сначала по выражению DISTINCT ON, затем по дате убывания, чтобы получить самую свежую запись для каждого пользователя.
Рабочий пример
WITH events(user_id, happened_at, action) AS (
VALUES (1, timestamp '2026-10-01 10:00', 'open'),
(1, timestamp '2026-10-02 09:00', 'save'),
(2, timestamp '2026-10-01 12:00', 'open')
)
SELECT DISTINCT ON (user_id) user_id, happened_at, action
FROM events
ORDER BY user_id, happened_at DESC;Порядок ORDER BY определяет, какую запись оставит PostgreSQL. Добавьте уникальный tie-breaker вроде id, если у строк может совпасть timestamp.
Частый вопрос
Можно ли отсортировать финальный вывод иначе?
Да. Оберните DISTINCT ON запрос в подзапрос, затем примените внешний ORDER BY к уже выбранным строкам.