Вычислить скользящее среднее выручки за 7 дней (по текущий день)
Таблица daily_revenue(day, revenue) содержит по одной строке на календарный день без пропусков. Вычислите скользящее среднее выручки за 7 дней — каждый день усредняется вместе с шестью предыдущими днями.
-- скользящее среднее выручки за 7 дней (по текущий день)
Напишите запрос.
Задают явную рамку: AVG(revenue) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW). Текущая строка и 6 предыдущих — окно из 7 строк. ROWS считает строки — нужна одна строка на день.
- ✗Считать рамку по умолчанию при
ORDER BYокном в 7 дней, а не нарастающей - ✗Путать
PRECEDINGиFOLLOWINGдля окна по текущий день - ✗Заменять рамку фиксированной недельной корзиной
GROUP BY
- →Как изменится ответ, если в таблице отсутствуют некоторые дни?
- →Почему
ROWSпредпочтительнееRANGEдля скользящего среднего с фиксированным числом?
Явная рамка ROWS BETWEEN 6 PRECEDING AND CURRENT ROW берёт текущую строку и шесть предыдущих — ровно 7 дней:
SELECT day,
revenue,
AVG(revenue) OVER (ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma_7d
FROM daily_revenue
ORDER BY day;
Без рамки OVER (ORDER BY day) даёт нарастающее среднее от начала, а не за 7 дней. ROWS считает физические строки, поэтому решение верно только при одной строке на день. При пропусках в датах нужна рамка RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW, которая считает по значению даты, а не по числу строк.