2. Есть таблица t, в которой указаны суммы транзакций клиентов за день:

Для предыдущего календарного дня используйте соединение по дате минус один день. LAG без проверки даты вернёт предыдущую строку, которая может быть намного старше.

Короткий ответ

Что ответить на собеседовании

Для предыдущего календарного дня используйте соединение по дате минус один день. LAG без проверки даты вернёт предыдущую строку, которая может быть намного старше.

Подробный разбор

Ответ с пояснениями

Условие

  1. Есть таблица 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. Если строк за день несколько, сначала агрегируйте их. Ожидаемая таблица в источнике отсутствует, поэтому показаны и отдельные суммы, и общий итог двух дней.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее