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

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

Разбор

До появления оконных функций соединение таблицы с собой было основным способом сравнить строку с предыдущей. Соединяем таблицу с собой: 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разбор после ответа
Как переписать запрос без RIGHT JOIN, используя только LEFT JOIN? Исходный запрос: SELECT u.user_id, o.order_id FROM users u RIGHT JOIN orders o ON u.user_id = o.user_id;
Тренировать SQL в Telegram

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