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

ROWS против RANGE на ряду с пропусками

Вопрос

Дневная выручка хранится только за дни с продажами, некоторые дни пропущены. Нужно скользящее среднее за 7 календарных дней. Что выбрать?

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

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

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

Коротко

Правильный ответ: RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW или достроить даты generateseries. ROWS считает строки: при пропусках 7 строк могут охватить две недели.

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

  1. ROWS BETWEEN 6 PRECEDING AND CURRENT ROW: шесть строк до текущей и она сама, это и есть 7 дней
  2. ROWS BETWEEN 7 PRECEDING AND CURRENT ROW, чтобы с запасом захватить и пропущенный день
  3. RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW или достроить даты generate_seriesправильный ответ
  4. Рамку не указывать: при ORDER BY по дате окно по умолчанию охватывает 7 последних дней

Разбор

ROWS считает строки: при пропусках 7 строк могут охватить две недели. RANGE с интервалом считает по значению даты, а ряд через generate_series вдобавок учтёт пропущенные дни как нули (это важно, если среднее должно делиться на 7). ROWS 7 PRECEDING даёт 8 строк. Рамка по умолчанию даёт нарастающий итог, а не 7 дней.

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

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