Выбор ответа 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.
Варианты ответа
- Все строки таблицы, отсортированные по пользователю и дате
- Уникальные пары пользователь и тариф, по последней дате для каждой пары
- По одной строке на пользователя: подписку с самым поздним
started_atправильный ответ - Ошибку: DISTINCT ON требует GROUP BY по тем же колонкам
Разбор
DISTINCT ON (ключ) оставляет первую строку каждой группы ключа в порядке ORDER BY. Поскольку внутри пользователя строки отсортированы по started_at убыванию, первая это последняя подписка. Это особенность PostgreSQL, короткая замена ROW_NUMBER() ... WHERE rn = 1. Выражения из DISTINCT ON должны идти первыми в ORDER BY. GROUP BY не нужен.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.