SQL‑запрос: пользователи, добавившие товары 101 и 102, но без 104

Отфильтруйте события add_to_cart и сгруппируйте их по user_id. В HAVING потребуйте хотя бы одно добавление каждого товара 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 не исключают пользователя. Период и способ получения заказа условием не ограничены, поэтому запрос учитывает всю доступную историю добавлений.

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

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

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

Подробнее