💡Совет дня
SQL — не просто язык запросов, а мощный инструмент для быстрого и точного извлечения инсайтов из больших данных. Рассмотрим несколько продвинутых кейсов, которые помогут сделать аналитику более эффективной и избежать типичных ловушек.
1. Ранжирование с помощью оконных функций Задача: Нужно определить топ-3 продукта по продажам в каждом регионе. Решение: Используем функцию ROW_NUMBER() для ранжирования по группам.
SELECT region, product_id, sales, ROW_NUMBER() OVER (PARTITION BY region ORDER BY sales DESC) as rank FROM sales_data WHERE sales_date >= '2025-01-01' QUALIFY rank <= 3;
2. Вычисление скользящего среднего Задача: Рассчитать среднее значение продаж за последние 7 дней для каждой даты. Решение: Используем оконную функцию AVG() с рамками окна.
SELECT sales_date, product_id, AVG(sales) OVER (PARTITION BY product_id ORDER BY sales_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as rolling_avg_7d FROM sales_data;
3. Поиск дубликатов с учётом нескольких колонок Задача: Найти записи, где совпадают клиент, дата и сумма, чтобы исключить дублирование. Решение: Используем COUNT() с GROUP BY и фильтрацию по количеству.
SELECT customer_id, order_date, amount, COUNT() as duplicate_count FROM orders GROUP BY customer_id, order_date, amount HAVING COUNT() > 1;
4. Поворот таблицы (Pivot) с агрегацией Задача: Нужно получить продажи по месяцам в отдельных столбцах для каждого продукта. Решение: Используем условные агрегаты.
SELECT product_id, SUM(CASE WHEN EXTRACT(MONTH FROM sales_date) = 1 THEN sales ELSE 0 END) as Jan_sales, SUM(CASE WHEN EXTRACT(MONTH FROM sales_date) = 2 THEN sales ELSE 0 END) as Feb_sales, SUM(CASE WHEN EXTRACT(MONTH FROM sales_date) = 3 THEN sales ELSE 0 END) as Mar_sales FROM sales_data GROUP BY product_id;
5. Использование CTE для упрощения сложных запросов Задача: Разбить запрос на логические части для удобства чтения и поддержки.
WITH recent_sales AS ( SELECT * FROM sales_data WHERE sales_date >= '2025-01-01' ), top_products AS ( SELECT product_id, SUM(sales) as total_sales FROM recent_sales GROUP BY product_id ORDER BY total_sales DESC LIMIT 10 ) SELECT rp.product_id, rp.total_sales, p.category FROM top_products rp JOIN products p ON rp.product_id = p.product_id; Запомните, даже самый спокойный медведь умеет рычать, когда надо. Берегите голову, берегите данные — и пусть в вашем дне будет немного тишины, ясности и добрых переменных.