SQLLab
Все статьи

Скрининг аналитиков данных: SQL-часть

Как провести SQL-часть технического скрининга аналитика данных: темы, задачи, уровни сложности и критерии оценки.

1 марта 2026 г.·4 мин чтения·

Аналитик данных — одна из самых востребованных позиций в России. Конкуренция за сильных кандидатов высока, а заниженный барьер на входе ведёт к потере времени команды. Правильный SQL-скрининг помогает найти баланс.

Чем аналитик данных отличается от других SQL-ролей

РольОсновные задачиSQL-фокус
Аналитик данныхОтчёты, дашборды, ad-hoc анализАгрегация, JOIN, оконные функции
Data ScientistМодели, экспериментыFeature engineering, статистика
BI-разработчикETL, витрины данныхСложные трансформации, оптимизация
Дата-инженерПайплайны, архитектураDDL, партиционирование, производительность

Для аналитика данных SQL — основной рабочий инструмент. Требования к нему выше, чем к DS, но ниже, чем к дата-инженеру.

Структура SQL-скрининга аналитика

Уровень 1: Базовая аналитика (обязательно для всех)

-- Датасет: e-commerce (orders, customers, products)
-- Задача: найдите топ-10 клиентов по выручке за последний квартал.
-- Покажите: имя клиента, количество заказов, суммарную выручку,
-- средний чек. Только завершённые заказы.

SELECT
    c.name,
    COUNT(o.id)        AS order_count,
    SUM(o.amount)      AS total_revenue,
    ROUND(AVG(o.amount), 0) AS avg_order
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'completed'
  AND o.created_at >= DATE_TRUNC('quarter', CURRENT_DATE)
GROUP BY c.id, c.name
ORDER BY total_revenue DESC
LIMIT 10;

Уровень 2: Продуктовая аналитика (Middle)

-- Задача: рассчитайте Retention Rate по когортам.
-- Когорта = месяц первой покупки. Retention = % вернувшихся в след. месяц.

WITH first_purchase AS (
    SELECT customer_id, DATE_TRUNC('month', MIN(order_date)) AS cohort_month
    FROM orders
    GROUP BY customer_id
),
monthly_activity AS (
    SELECT DISTINCT customer_id, DATE_TRUNC('month', order_date) AS activity_month
    FROM orders
)
SELECT
    fp.cohort_month,
    COUNT(DISTINCT fp.customer_id)                              AS cohort_size,
    COUNT(DISTINCT ma.customer_id)                              AS retained,
    ROUND(100.0 * COUNT(DISTINCT ma.customer_id)
               / COUNT(DISTINCT fp.customer_id), 1)             AS retention_pct
FROM first_purchase fp
LEFT JOIN monthly_activity ma
    ON ma.customer_id = fp.customer_id
    AND ma.activity_month = fp.cohort_month + INTERVAL '1 month'
GROUP BY fp.cohort_month
ORDER BY fp.cohort_month;

Зачем эта задача: retention analysis — стандартная аналитическая задача. Если кандидат решает её уверенно, он работал с реальными продуктовыми данными.

Уровень 3: Оптимизация и сложные запросы (Senior)

-- Задача: найдите пользователей, которые совершили покупку
-- в течение 7 дней после регистрации (конверсия в первую покупку)
-- и сравните средний LTV этих пользователей с остальными

WITH user_stats AS (
    SELECT
        u.id,
        u.registered_at::DATE                                   AS reg_date,
        MIN(o.order_date)                                       AS first_order_date,
        CASE WHEN MIN(o.order_date) <= u.registered_at::DATE + 7
             THEN 'fast_converter' ELSE 'slow_converter' END    AS segment,
        SUM(o.amount)                                           AS ltv
    FROM users u
    LEFT JOIN orders o ON o.user_id = u.id AND o.status = 'completed'
    GROUP BY u.id, u.registered_at
)
SELECT
    segment,
    COUNT(*)                          AS user_count,
    ROUND(AVG(ltv), 0)                AS avg_ltv,
    ROUND(MEDIAN(ltv)::NUMERIC, 0)    AS median_ltv
FROM user_stats
WHERE segment IS NOT NULL
GROUP BY segment;

Практические вопросы для собеседования

Вопрос 1: «Как вы строите метрики, которых нет в БД?»

Хороший ответ: описывает процесс декомпозиции бизнес-метрики на SQL-операции. Например, DAU = COUNT(DISTINCT user_id) WHERE date = CURRENT_DATE в таблице событий.

Вопрос 2: «Расскажите про случай, когда SQL-запрос работал слишком медленно»

Хороший ответ: конкретный пример из опыта, как диагностировал и что сделал (добавил индекс, переписал подзапрос, изменил фильтр).

Вопрос 3: «Как бы вы проверили корректность своей аналитики?»

Хороший ответ: проверка граничных значений, сравнение с другим источником, сумма частей должна равняться целому, проверка на NULL.

Что отличает сильного аналитика на скрининге

  • Уточняет задачу перед написанием — спрашивает про период, статусы, граничные случаи
  • Знает бизнес-контекст — понимает, зачем нужна метрика
  • Думает об edge cases — пустые таблицы, NULL, дубликаты
  • Предлагает несколько решений — и объясняет, какое выбрал и почему
  • Понимает, что делать с результатом — не просто пишет запрос, а интерпретирует данные

Чеклист SQL-скрининга аналитика

  • Задача на GROUP BY с несколькими агрегатными функциями
  • Задача на JOIN двух или трёх таблиц
  • Задача на оконную функцию (ROW_NUMBER или LAG)
  • Задача с CTE (для Middle+)
  • Вопрос на знание EXPLAIN (для Senior)
  • Вопрос-кейс на бизнес-метрику

Помогите аналитикам подготовиться к вашему скринингу — направьте их на SQLlab.ru, где курс построен именно вокруг аналитических задач.

Похожие статьи

Попробуй на практике

Тренажёр с реальными задачами — бесплатно и без регистрации

Открыть тренажёр →