Выбор ответа Middle SQL дата-инженера обновлено

DISTINCT ON в PostgreSQL

Вопрос

Что вернёт SELECT DISTINCT ON (user_id) user_id, plan FROM subs ORDER BY user_id, started_at DESC?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: По одной строке на пользователя: подписку с самым поздним startedat. DISTINCT ON (ключ) оставляет первую строку каждой группы ключа в порядке ORDER BY.

Варианты ответа

  1. Все строки таблицы, отсортированные по пользователю и дате
  2. Уникальные пары пользователь и тариф, по последней дате для каждой пары
  3. По одной строке на пользователя: подписку с самым поздним started_atправильный ответ
  4. Ошибку: DISTINCT ON требует GROUP BY по тем же колонкам

Разбор

DISTINCT ON (ключ) оставляет первую строку каждой группы ключа в порядке ORDER BY. Поскольку внутри пользователя строки отсортированы по started_at убыванию, первая это последняя подписка. Это особенность PostgreSQL, короткая замена ROW_NUMBER() ... WHERE rn = 1. Выражения из DISTINCT ON должны идти первыми в ORDER BY. GROUP BY не нужен.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.