Отфильтруйте события add_to_cart и сгруппируйте их по user_id. В HAVING потребуйте хотя бы одно добавление каждого товара 101 и 102 и ни одного добавления 104.
SQL‑запрос: пользователи, добавившие товары 101 и 102, но без 104
Отфильтруйте события add_to_cart и сгруппируйте их по user_id. В HAVING потребуйте хотя бы одно добавление каждого товара 101 и 102 и ни одного добавления 104.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо получить перечень уникальных идентификаторов пользователей, которые в своих действиях добавляли в корзину товары с идентификаторами 101 и 102, при этом не совершали добавления товара с идентификатором 104.
Данные и описание:
Таблица stage.lo_events с полями:
user_id - id пользователя
event_name - наименование события
view_item - просмотр товара
add_to_cart - добавление товара в корзину
event_datetime - время события
product_id - id товара
order_type - способ получения заказа (delivery / pickup)
Ответ
Отфильтруйте события add_to_cart и сгруппируйте их по user_id. В HAVING потребуйте хотя бы одно добавление каждого товара 101 и 102 и ни одного добавления 104.
Универсальный вариант с условной агрегацией:
SELECT user_id
FROM stage.lo_events
WHERE event_name = 'add_to_cart'
AND product_id IN (101, 102, 104)
GROUP BY user_id
HAVING SUM(CASE WHEN product_id = 101 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN product_id = 102 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN product_id = 104 THEN 1 ELSE 0 END) = 0;
Повторные события не создают дубликатов пользователей. Просмотры товара 104 не исключают пользователя. Период и способ получения заказа условием не ограничены, поэтому запрос учитывает всю доступную историю добавлений.