Без оконных функций нужно для каждого дня посчитать изменение выручки по сравнению с предыдущим днём. Таблица daily_revenue содержит date и revenue. Как это сделать?

AСоединить таблицу саму с собой по равенству дат: ON a.date = b.date и вычислить разницу
BИспользовать CROSS JOIN таблицы с собой и в WHERE оставить пары с минимальной разницей дат
CСоединить таблицу с собой по условию ON b.date = a.date - INTERVAL '1 day' для получения предыдущего дня
DИспользовать UNION ALL текущего и сдвинутого запроса для формирования пар строк
Правильный ответ. Self-join со сдвигом: FROM daily_revenue a JOIN daily_revenue b ON b.date = a.date - INTERVAL '1 day' даёт пару текущего и предыдущего дня для вычисления разницы.

Разбор

До появления оконных функций self-join был основным способом сравнить строку с предыдущей. Соединяем таблицу с собой: a — текущий день, b — предыдущий через условие b.date = a.date - INTERVAL '1 day'. Разница: a.revenue - b.revenue. Первый день потеряет пару — INNER JOIN его отбросит, LEFT JOIN сохранит с NULL. Современная альтернатива: LAG(revenue) OVER(ORDER BY date).

Проверь себя · 1/3разбор после ответа
Есть payments(user_id) и refunds(user_id). Нужно получить пользователей, у которых был платёж, но не было возврата. Какой вариант корректнее всего описывает задачу?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»