Изменение выручки месяц к месяцу через LAG с меткой рост / падение / без изменений
Таблица monthly_revenue(month, revenue) содержит по одной строке на месяц. Для каждого месяца верните его выручку, изменение к предыдущему месяцу и метку — increase, decrease или no change. У первого месяца нет предыдущего для сравнения.
-- месяц, выручка, изменение к пред. месяцу и метка increase/decrease/no change
Напишите запрос.
LAG(revenue) OVER (ORDER BY month) подтягивает прошлый месяц в текущую строку; вычитание даёт изменение. CASE по знаку ставит метку рост, падение или без изменений. У первого месяца LAG равен NULL.
- ✗Использовать
LEAD(следующая строка), когда нуженLAG(предыдущая) - ✗Помечать первый месяц вместо того, чтобы оставить тренд пустым
- ✗Добавлять
PARTITION BY month, что изолирует месяц, иLAGвсегда null
- →Как посчитать процентное изменение вместо абсолютного?
- →Что происходит со строкой первого месяца и как её показать?
LAG(revenue) OVER (ORDER BY month) подтягивает выручку предыдущего месяца, а CASE по знаку разницы даёт метку:
SELECT month,
revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change,
CASE
WHEN LAG(revenue) OVER (ORDER BY month) IS NULL THEN 'n/a'
WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'increase'
WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'decrease'
ELSE 'no change'
END AS trend
FROM monthly_revenue
ORDER BY month;
LEAD смотрел бы вперёд (следующий месяц), а не назад. У первого месяца LAG равен NULL — его помечают n/a, а не increase. PARTITION BY month был бы ошибкой: он изолировал бы каждый месяц, и LAG всегда возвращал бы NULL.