Сначала посчитайте сумму заказов на день, заполните отсутствующие дни нулями, затем примените AVG по текущей и двум предыдущим строкам календаря каждого пользователя.
Как добавить скользящее среднее суммы заказа за текущий и два предыдущих дня в разрезе пользователя?
Сначала посчитайте сумму заказов на день, заполните отсутствующие дни нулями, затем примените AVG по текущей и двум предыдущим строкам календаря каждого пользователя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Сначала посчитайте сумму заказов на день, заполните отсутствующие дни нулями, затем примените AVG по текущей и двум предыдущим строкам календаря каждого пользователя.
Предположим calendar(day) содержит непрерывные даты, включая нужную предысторию:
WITH daily AS (
SELECT user_id, CAST(order_dt AS date) AS day, SUM(amount) AS total
FROM orders GROUP BY user_id, CAST(order_dt AS date)
), filled AS (
SELECT u.user_id, c.day, COALESCE(d.total, 0) AS total
FROM (SELECT DISTINCT user_id FROM orders) u
CROSS JOIN calendar c
LEFT JOIN daily d ON d.user_id = u.user_id AND d.day = c.day
)
SELECT user_id, day,
AVG(CAST(total AS DECIMAL(20, 2))) OVER (
PARTITION BY user_id ORDER BY day
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS average_3_days
FROM filled;
Без календаря три строки могут означать три дня с покупками, а не три соседних дня. На первых двух датах окна короче; для полного окна загрузите два предшествующих дня и отфильтруйте отображаемый период уже после расчёта.