Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
SQL: основной инструмент Data Analyst для анализа данных
SQL — это первый инструмент, к которому я обращаюсь при решении аналитических задач. За 10+ лет я нашёл оптимальный баланс между простотой, производительностью и масштабируемостью.
Основные сценарии применения SQL
1. Создание витрин и датасетов для аналитики
- Построение таблиц для BI-инструментов (Tableau, Power BI, Looker)
- Создание промежуточных слоёв в ETL pipeline
- Подготовка данных для обучающих выборок ML моделей
2. Расчёт бизнес-метрик и KPI
- DAU/MAU (Daily/Monthly Active Users)
- Retention, Churn, LTV (Lifetime Value)
- Revenue, ARPU, Conversion Rate
- Эти расчёты часто исполняются по расписанию в Airflow
3. Исследовательский анализ данных (EDA)
- Быстрые SELECT запросы для понимания распределения данных
- Проверка качества данных и поиск аномалий
- Выявление корреляций между переменными
4. Объединение данных из разных источников
- JOIN между CRM, Analytics, Billing системами
- Создание единого представления клиента
- Кросс-система анализ поведения пользователей
Практические примеры
Пример 1: Расчёт RFM сегментации
WITH customer_metrics AS (
SELECT
customer_id,
MAX(order_date) as last_purchase,
COUNT(DISTINCT order_id) as frequency,
SUM(order_amount) as monetary
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '1 year'
GROUP BY customer_id
),
rfm_scores AS (
SELECT
customer_id,
DATEDIFF(DAY, last_purchase, CURRENT_DATE) as recency_days,
NTILE(5) OVER (ORDER BY DATEDIFF(DAY, last_purchase, CURRENT_DATE) DESC) as r_score,
NTILE(5) OVER (ORDER BY frequency) as f_score,
NTILE(5) OVER (ORDER BY monetary) as m_score
FROM customer_metrics
)
SELECT
customer_id,
r_score || f_score || m_score as rfm_segment,
CASE
WHEN r_score >= 4 AND f_score >= 4 AND m_score >= 4 THEN 'Champions'
WHEN r_score >= 3 AND f_score >= 3 AND m_score >= 3 THEN 'Loyal Customers'
WHEN r_score >= 3 AND f_score <= 2 THEN 'Potential Loyalists'
ELSE 'At Risk'
END as customer_segment
FROM rfm_scores
ORDER BY rfm_segment DESC
Пример 2: Анализ воронки конверсии
WITH funnel_steps AS (
SELECT
user_id,
MAX(CASE WHEN event = 'page_view' THEN 1 ELSE 0 END) as saw_product,
MAX(CASE WHEN event = 'add_to_cart' THEN 1 ELSE 0 END) as added_to_cart,
MAX(CASE WHEN event = 'checkout_start' THEN 1 ELSE 0 END) as started_checkout,
MAX(CASE WHEN event = 'purchase' THEN 1 ELSE 0 END) as completed_purchase
FROM user_events
WHERE event_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
)
SELECT
SUM(saw_product) as view,
SUM(added_to_cart) as cart,
SUM(started_checkout) as checkout,
SUM(completed_purchase) as purchase,
ROUND(100.0 * SUM(added_to_cart) / SUM(saw_product), 2) as view_to_cart_rate,
ROUND(100.0 * SUM(completed_purchase) / SUM(started_checkout), 2) as checkout_to_purchase_rate
FROM funnel_steps
Пример 3: Когортный анализ с CTE
WITH user_cohorts AS (
SELECT
user_id,
DATE_TRUNC('month', MIN(registration_date))::DATE as cohort_month
FROM users
GROUP BY user_id
),
user_activity AS (
SELECT
uc.cohort_month,
DATE_TRUNC('month', e.event_date)::DATE as activity_month,
COUNT(DISTINCT uc.user_id) as active_count
FROM user_cohorts uc
JOIN events e ON uc.user_id = e.user_id
GROUP BY uc.cohort_month, DATE_TRUNC('month', e.event_date)
)
SELECT
cohort_month,
activity_month,
(EXTRACT(YEAR FROM activity_month) * 12 + EXTRACT(MONTH FROM activity_month)) -
(EXTRACT(YEAR FROM cohort_month) * 12 + EXTRACT(MONTH FROM cohort_month)) as months_since_cohort,
active_count
FROM user_activity
ORDER BY cohort_month, activity_month
Принципы оптимизации SQL
Индексы
- Индексы на колонки в WHERE, JOIN, GROUP BY
- Составные индексы для частых комбинаций
- Анализ через EXPLAIN ANALYZE перед оптимизацией
Оптимизация запроса
- Фильтрация данных как можно раньше (WHERE перед JOIN)
- Использование агрегатных функций вместо подзапросов где возможно
- Избегание лишних DISTINCT и ORDER BY
Разделение логики
- CTE (WITH) для читаемости и переиспользования подзапросов
- Window функции (ROW_NUMBER, RANK, LAG) для сложных расчётов
- Временные таблицы для промежуточных результатов
Когда я переходу с SQL на Python
- Очень сложная бизнес-логика, которая занимает 20+ строк SQL
- Работа с неструктурированными данными
- Интеграция с внешними API
- Machine learning и прогнозирование
В этих случаях SQL используется для извлечения данных, а основная обработка происходит в Python.
SQL — это базовый навык Data Analyst, и я инвестирую в глубокое понимание оптимизации и лучших практик, потому что это напрямую влияет на скорость выполнения аналитики и качество инсайтов.