SQL - самый ценный hard skill для маркетолога после Excel. Один SQL-запрос заменяет 30 минут в интерфейсе GA4.
#intermediate #technical #block-12
Навигация
← 12.10 - Частые ошибки в A-B-тестах | → 12.12 - SQL - продвинутые запросы
Зачем маркетологу SQL
- Самостоятельный доступ к данным без аналитика
- BigQuery (GA4 export) → любой отчёт, который не существует в интерфейсе
- CRM-база: сегментация, когорты, RFM
- Автоматизация отчётов (SQL + Looker Studio)
Основы: SELECT → FROM → WHERE → GROUP BY
-- Сколько покупок по каналам за последний месяц?
SELECT
traffic_source,
COUNT(*) AS purchases,
SUM(revenue) AS total_revenue,
AVG(revenue) AS avg_order_value
FROM orders
WHERE order_date >= '2024-01-01'
AND order_date < '2024-02-01'
AND status = 'completed'
GROUP BY traffic_source
ORDER BY total_revenue DESC;
Порядок выполнения SQL
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
Ключевые операторы
JOIN - объединение таблиц
-- Заказы + данные клиентов
SELECT
o.order_id,
o.revenue,
c.email,
c.registration_date,
c.city
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01';
| Тип JOIN | Что возвращает |
|---|---|
| INNER JOIN | Только совпадающие строки |
| LEFT JOIN | Все из левой + совпадающие из правой |
| RIGHT JOIN | Все из правой + совпадающие из левой |
| FULL JOIN | Все строки из обеих таблиц |
Агрегатные функции
| Функция | Описание |
|---|---|
COUNT(*) | Количество строк |
SUM(column) | Сумма |
AVG(column) | Среднее |
MIN(column) / MAX(column) | Мин / Макс |
COUNT(DISTINCT column) | Уникальные значения |
WHERE - фильтрация
WHERE status = 'completed' -- равно
AND revenue > 10000 -- больше
AND city IN ('Алматы', 'Астана') -- в списке
AND email IS NOT NULL -- не пусто
AND order_date BETWEEN '2024-01-01' AND '2024-01-31' -- диапазон
AND product_name LIKE '%Samsung%' -- содержит
GROUP BY + HAVING
-- Клиенты с 3+ покупками (VIP)
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(revenue) AS total_spent
FROM orders
WHERE status = 'completed'
GROUP BY customer_id
HAVING COUNT(*) >= 3
ORDER BY total_spent DESC;
Маркетинговые запросы - примеры
1. Конверсия по каналам
SELECT
utm_source,
utm_medium,
COUNT(DISTINCT session_id) AS sessions,
COUNT(DISTINCT CASE WHEN event = 'purchase' THEN session_id END) AS purchases,
ROUND(COUNT(DISTINCT CASE WHEN event = 'purchase' THEN session_id END) * 100.0
/ COUNT(DISTINCT session_id), 2) AS conversion_rate
FROM events
WHERE date >= '2024-01-01'
GROUP BY utm_source, utm_medium
ORDER BY sessions DESC;
2. Когортный retention
SELECT
DATE_TRUNC(first_purchase_date, MONTH) AS cohort,
DATE_DIFF(order_date, first_purchase_date, MONTH) AS months_since_first,
COUNT(DISTINCT customer_id) AS customers
FROM (
SELECT
customer_id,
order_date,
MIN(order_date) OVER (PARTITION BY customer_id) AS first_purchase_date
FROM orders
)
GROUP BY cohort, months_since_first
ORDER BY cohort, months_since_first;
3. RFM-сегментация
SELECT
customer_id,
DATE_DIFF(CURRENT_DATE(), MAX(order_date), DAY) AS recency_days,
COUNT(*) AS frequency,
SUM(revenue) AS monetary,
NTILE(5) OVER (ORDER BY DATE_DIFF(CURRENT_DATE(), MAX(order_date), DAY) DESC) AS r_score,
NTILE(5) OVER (ORDER BY COUNT(*)) AS f_score,
NTILE(5) OVER (ORDER BY SUM(revenue)) AS m_score
FROM orders
WHERE status = 'completed'
GROUP BY customer_id;
Где практиковать
| Ресурс | URL | Стоимость |
|---|---|---|
| SQLZoo | sqlzoo.net | Бесплатно |
| LeetCode (SQL) | leetcode.com/problemset/database | Бесплатно |
| Mode Analytics SQL Tutorial | mode.com/sql-tutorial | Бесплатно |
| BigQuery Sandbox | cloud.google.com/bigquery/docs/sandbox | Бесплатно (10GB) |
| Kaggle Datasets | kaggle.com/datasets | Бесплатно |
🔧 Практика
- Установите BigQuery Sandbox (бесплатно)
- Загрузите GA4 sample dataset от Google
- Напишите 5 запросов: MAU, top pages, source/medium performance, funnel (page_view → purchase), daily revenue trend