В таблице с месячной выручкой (по одной строке на пользователя и месяц) нужно посчитать изменение относительно прошлого месяца: текущая revenue минус прошлая revenue. Какое выражение корректно?

Arevenue - LEAD(revenue) OVER (PARTITION BY user_id ORDER BY month)
Brevenue - LAG(revenue) OVER (PARTITION BY user_id)
Crevenue - LAG(revenue) OVER (PARTITION BY user_id ORDER BY month)
Drevenue - SUM(revenue) OVER (PARTITION BY user_id ORDER BY month)
Правильный ответ. Для сравнения «текущий период минус прошлый» нужна LAG с сортировкой по времени.

Разбор

LAG(revenue) OVER (PARTITION BY user_id ORDER BY month) возвращает значение revenue из предыдущего месяца для того же user_id. Тогда разница revenue - LAG(revenue) ... даёт изменение от прошлого периода к текущему. Без сортировки по month понятие «предыдущий месяц» не определено. С LEAD вы сравните текущий месяц со следующим, то есть получите сдвиг вперёд, а SUM(...) OVER посчитает накопленный итог, а не разницу.

Проверь себя · 1/3разбор после ответа
В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем RANK() OVER (ORDER BY revenue DESC). Какие ранги получат строки при сортировке по убыванию выручки?
Тренировать SQL в Telegram

Ещё вопросы по теме «Оконные функции»