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

Трюк с датой минус номер строки

Вопрос

Почему выражение d - ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY d) одинаково внутри непрерывной серии дней?

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

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

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

Коротко

Правильный ответ: Внутри серии дата и номер строки растут на 1 за шаг, разность постоянна; на разрыве дата прыгает. Дни 1, 2, 3 получают номера 1, 2, 3: разность 0, 0, 0.

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

  1. ROW_NUMBER автоматически сбрасывается на каждом пропуске дат, поэтому разность постоянна внутри серии
  2. PostgreSQL при вычитании числа из даты округляет результат до начала недели
  3. Это работает, только если в серии ровно 7 дней, иначе разность начинает расти
  4. Внутри серии дата и номер строки растут на 1 за шаг, разность постоянна; на разрыве дата прыгаетправильный ответ

Разбор

Дни 1, 2, 3 получают номера 1, 2, 3: разность 0, 0, 0. После пропуска день 5 получает номер 4: разность 1, новая группа. ROW_NUMBER сам не сбрасывается. Округления дат нет. Длина серии не важна. Условие трюка: даты в пределах пользователя уникальны, иначе дубли надо убрать заранее.

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

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