Выбор ответа Senior SQL дата-инженера обновлено
Трюк с датой минус номер строки
Вопрос
Почему выражение d - ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY d) одинаково внутри непрерывной серии дней?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Внутри серии дата и номер строки растут на 1 за шаг, разность постоянна; на разрыве дата прыгает. Дни 1, 2, 3 получают номера 1, 2, 3: разность 0, 0, 0.
Варианты ответа
- ROW_NUMBER автоматически сбрасывается на каждом пропуске дат, поэтому разность постоянна внутри серии
- PostgreSQL при вычитании числа из даты округляет результат до начала недели
- Это работает, только если в серии ровно 7 дней, иначе разность начинает расти
- Внутри серии дата и номер строки растут на 1 за шаг, разность постоянна; на разрыве дата прыгаетправильный ответ
Разбор
Дни 1, 2, 3 получают номера 1, 2, 3: разность 0, 0, 0. После пропуска день 5 получает номер 4: разность 1, новая группа. ROW_NUMBER сам не сбрасывается. Округления дат нет. Длина серии не важна. Условие трюка: даты в пределах пользователя уникальны, иначе дубли надо убрать заранее.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.