Как добавить скользящее среднее суммы заказа за текущий и два предыдущих дня в разрезе пользователя?

Сначала посчитайте сумму заказов на день, заполните отсутствующие дни нулями, затем примените 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;

Без календаря три строки могут означать три дня с покупками, а не три соседних дня. На первых двух датах окна короче; для полного окна загрузите два предшествующих дня и отфильтруйте отображаемый период уже после расчёта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее