SQL Gym Pro #5 - разбор ⚡ 🎯 Задача

Найти для каждого магазина пару товаров, которые чаще всего покупают вместе.

💡 Решение в 10 строк WITH pairs AS ( SELECT s1.store_id, s1.product_id p1, s2.product_id p2 FROM sales s1 JOIN sales s2 ON s1.store_id = s2.store_id AND s1.date = s2.date AND s1.receipt_id = s2.receipt_id AND s1.product_id < s2.product_id -- Ключ! Убираем дубли ) SELECT store_id, p1, p2 FROM ( SELECT store_id, p1, p2, ROW_NUMBER() OVER (PARTITION BY store_id ORDER BY COUNT(*) DESC) as rn FROM pairs GROUP BY store_id, p1, p2 ) t WHERE rn = 1;

🧠 Логика

1. SELF JOIN - находим товары в одном чеке 2. < - чтобы не было дублей (1-5 и 5-1) 3. COUNT + GROUP BY - считаем частоту пар 4. ROW_NUMBER + PARTITION - выбираем самую частую для каждого магазина

⚡ Оптимизация

· Индекс на (store_id, date, receipt_id) · Если много данных → фильтровать чеки с 2+ товарами · Для больших сетей → обрабатывать по магазинам отдельно

🎯 Вывод

Задача на оконные функции + умный JOIN. Основная сложность - убрать дубли пар.