PostgreSQL DISTINCT ON: последняя строка каждой группы

Категория: Postgresql · Язык: SQL · Обновлено:

DISTINCT ON оставляет одну строку на значение группы. Сортируйте сначала по выражению DISTINCT ON, затем по дате убывания, чтобы получить самую свежую запись для каждого пользователя.

Рабочий пример

SQL
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 к уже выбранным строкам.