Для предыдущего календарного дня используйте соединение по дате минус один день. LAG без проверки даты вернёт предыдущую строку, которая может быть намного старше.
2. Есть таблица t, в которой указаны суммы транзакций клиентов за день:
Для предыдущего календарного дня используйте соединение по дате минус один день. LAG без проверки даты вернёт предыдущую строку, которая может быть намного старше.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
- Есть таблица t, в которой указаны суммы транзакций клиентов за день:
- Напишите запрос, который для каждой строки покажет транзакции клиента за текущий и предыдущий календарный день
Итоговая таблица ниже:
Ответ
Для предыдущего календарного дня используйте соединение по дате минус один день. LAG без проверки даты вернёт предыдущую строку, которая может быть намного старше.
Предположим, t содержит client_id, dt типа date и amount, по одной строке на клиента и день:
SELECT cur.client_id, cur.dt,
cur.amount AS current_day_amount,
prev.amount AS previous_day_amount,
cur.amount + COALESCE(prev.amount, 0) AS two_day_total
FROM t cur
LEFT JOIN t prev
ON prev.client_id = cur.client_id
AND prev.dt = cur.dt - 1
ORDER BY cur.client_id, cur.dt;
Здесь отсутствие вчерашних данных считается нулём только для суммы; отдельная колонка сохраняет NULL. Если строк за день несколько, сначала агрегируйте их. Ожидаемая таблица в источнике отсутствует, поэтому показаны и отдельные суммы, и общий итог двух дней.