Используйте EXISTS для продажи после январской коммуникации в пределах 30 дней и DISTINCT для клиента. Продажи могут приходиться на февраль; ограничивать январём обе таблицы нельзя.
Клиенты с продажей в течение 30 дней после коммуникации
Используйте EXISTS для продажи после январской коммуникации в пределах 30 дней и DISTINCT для клиента. Продажи могут приходиться на февраль; ограничивать январём обе таблицы нельзя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Найди всех клиентов в январе, у которых после коммуникации в течении 30 дней была хотя бы одна продажа.
sales
id customer_id amount sale_date [phone]
communications
id customer_id type comm_date partition_date 1 1 mail [phone] call [phone] call [phone] email [phone] sms [phone]
Ответ
Используйте EXISTS для продажи после январской коммуникации в пределах 30 дней и DISTINCT для клиента. Продажи могут приходиться на февраль; ограничивать январём обе таблицы нельзя.
Пусть речь о коммуникациях в январе заданного года, продажа должна быть строго позже и не позднее 30 дней. PostgreSQL:
SELECT DISTINCT c.customer_id
FROM communications c
WHERE c.comm_date >= :january_start
AND c.comm_date < :february_start
AND EXISTS (
SELECT 1
FROM sales s
WHERE s.customer_id = c.customer_id
AND s.sale_date > c.comm_date
AND s.sale_date <= c.comm_date + INTERVAL '30 days'
);
Параметры — начало января и февраля нужного года. Поле partition_date не заменяет дату события без дополнительного контракта. По повреждённым датам в примере нельзя вычислить конкретный список клиентов.