Вывести компании без единой транзакции за последние 30 дней, используя JOIN, без подзапроса в WHERE.
SQL: компании без транзакций за последние 30 дней
Вывести компании без единой транзакции за последние 30 дней, используя JOIN, без подзапроса в WHERE.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вывести компании без единой транзакции за последние 30 дней, используя JOIN, без подзапроса в WHERE.
Решение на PostgreSQL
Ниже «последние 30 дней» — скользящий интервал до текущего момента, а transaction_id — NOT NULL ключ транзакции.
SELECT c.*
FROM companies c
LEFT JOIN transactions t
ON c.company_id = t.company_id
AND t.transaction_date >= CURRENT_TIMESTAMP - INTERVAL '30 days'
AND t.transaction_date <= CURRENT_TIMESTAMP
WHERE t.transaction_id IS NULL;
Если в периоде нет транзакций, правая часть соединения заполнена NULL, и компания остаётся в результате. Компании без транзакций вообще также будут показаны.
Фильтрация правой таблицы по датам в WHERE после LEFT JOIN убрала бы нужные строки без совпадений. Для требования о календарных днях, а не последних 30 сутках, нужно отдельно определить границы и часовой пояс.