## SQL Запросы для Northwind (обновленные) ### 🟢 Уровень 1: Базовый SQL #### Вопрос 1: Фильтрация и сортировка **Задача:** Вывести топ-5 клиентов (company_name), у которых наибольшее количество заказов в 1997 году. --- #### Вопрос 2: Агрегация с HAVING **Задача:** Найти страны, в которых зарегистрировано более 3 клиентов. --- #### Вопрос 3: JOIN и вычисляемые поля **Задача:** Вывести список заказов (order_id, order_date) с суммой заказа (unit_price * quantity * (1 - discount)). --- ### 🟡 Уровень 2: Средний уровень #### Вопрос 4: Подзапросы и NOT EXISTS **Задача:** Найти клиентов, которые никогда не делали заказов. --- #### Вопрос 5: Оконные функции — RANK() и DENSE_RANK() **Задача:** Проранжировать продукты по количеству продаж в каждой категории. --- #### Вопрос 6: LAG/LEAD — анализ изменений **Задача:** Рассчитать для каждого клиента разницу в днях между текущим заказом и предыдущим. --- #### Вопрос 7: CASE и сегментация **Задача:** Классифицировать сотрудников по возрастным группам (используя birth_date). --- #### Вопрос 8: CTE и сложная агрегация **Задача:** Найти топ-3 продукта по выручке в каждой категории. --- #### Вопрос 9: Скользящее среднее (Moving Average) **Задача:** Рассчитать скользящее среднее выручки за 3 месяца для 1997 года. --- ### 🔴 Уровень 3: Продвинутый уровень #### Вопрос 10: Рекурсивный CTE (иерархия сотрудников) **Задача:** Показать иерархию подчинения сотрудников (employee_id, reports_to). --- #### Вопрос 11: CROSS TAB / PIVOT — продажи по категориям **Задача:** Создать отчет по продажам за 1997 год, где строки — месяцы, столбцы — категории продуктов. **Вариант с CASE (кросс-таблица):** --- #### Вопрос 12: Анализ повторных покупок **Задача:** Найти клиентов, которые сделали хотя бы 3 заказа, и рассчитать средний интервал между заказами. --- #### Вопрос 13: Cohort Analysis — анализ удержания **Задача:** Провести когортный анализ по месяцам регистрации клиентов и их активности в последующие месяцы. --- ### Вопрос 14: Товары, которые часто покупают вместе **Задача:** Найти пары продуктов, которые часто встречаются в одном заказе. --- #### Вопрос 15: Процент от общего (оконные функции) **Задача:** Рассчитать для каждой категории процент от общей выручки. --- #### Вопрос 16: Сравнение с предыдущим периодом (YoY) **Задача:** Сравнить выручку по месяцам текущего и предыдущего года. --- #### Вопрос 17: Анализ по поставщикам **Задача:** Найти поставщиков, у которых нет продаж за последние 3 месяца. --- #### Вопрос 18: Customer Lifetime Value (LTV) **Задача:** Рассчитать LTV для каждого клиента. --- test ### 📝 Бонус: Вопросы на оптимизацию #### Вопрос 19: Оптимизация запроса **Проблемный запрос:** ```sql SELECT * FROM order_details od INNER JOIN orders o ON od.order_id = o.order_id INNER JOIN customers c ON o.customer_id = c.customer_id WHERE c.country = 'USA' AND od.unit_price > 50 AND o.order_date BETWEEN '1997-01-01' AND '1997-12-31'; ``` **Какие индексы вы создадите?** --- Все запросы адаптированы для PostgreSQL (используется синтаксис `EXTRACT`, `INTERVAL`, `::varchar`, `AGE()`). Для MySQL потребуются небольшие корректировки (замена `EXTRACT` на `YEAR()/MONTH()`, `DATE_ADD`, `LIMIT` и т.д.).