Есть таблица clients (client_id, ФИО, date_start, date_end) и таблица transactions (transaction_id, client_id, дата, сумма). Нужно рассчитать сумму транзакций по каждому клиенту за 1 мая 2025 года и вывести client_id, ФИО, сумму. Напиши SQL.

Отфильтруйте транзакции за нужный день и соедините их с версией клиента, действовавшей в момент операции. Границы дня и периода лучше делать полуоткрытыми.

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

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

Отфильтруйте транзакции за нужный день и соедините их с версией клиента, действовавшей в момент операции. Границы дня и периода лучше делать полуоткрытыми.

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

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

Отфильтруйте транзакции за нужный день и соедините их с версией клиента, действовавшей в момент операции. Границы дня и периода лучше делать полуоткрытыми.

Вариант PostgreSQL для клиентов с транзакциями, с именами колонок из условия:

SELECT t.client_id, c."ФИО", SUM(t."сумма") AS total_amount
FROM transactions t
JOIN clients c
  ON c.client_id = t.client_id
 AND t."дата" >= c.date_start
 AND (t."дата" < c.date_end OR c.date_end IS NULL)
WHERE t."дата" >= TIMESTAMP '2025-05-01 00:00:00'
  AND t."дата" < TIMESTAMP '2025-05-02 00:00:00'
GROUP BY t.client_id, c."ФИО";

Интервалы версий одного клиента не должны пересекаться, иначе сумма размножится. Для timestamptz уточните бизнес-часовой пояс границ. Если ФИО менялось внутри дня, результат разделится по ФИО; для строго одной строки на клиента сначала агрегируйте по client_id и выберите имя на согласованный момент, например начало дня. Клиентов без операций при необходимости добавляют отдельным LEFT JOIN.

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

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

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

Подробнее