💡Совет дня

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; Запомните, даже самый спокойный медведь умеет рычать, когда надо. Берегите голову, берегите данные — и пусть в вашем дне будет немного тишины, ясности и добрых переменных.