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