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: Оптимизация запроса
Проблемный запрос:
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 и т.д.).