Вопрос с собеседования · Аналитика данных

Как посчитать воронку конверсии на SQL?

MiddleSQL для аналитикаSQL
Ещё спрашивают так:
  • Как посчитать конверсию из просмотра в покупку?
Коротко

Для каждого пользователя определить, дошёл ли он до каждого шага в правильном порядке (время шага не раньше предыдущего) и в пределах окна (например, 7 дней от первого шага), затем посчитать число пользователей на каждом шаге и доли от первого и от предыдущего шага.

  • Простой подсчёт «сколько было событий каждого типа» — не воронка: порядок и принадлежность одному пользователю не учтены
  • Конверсию считают по пользователям или по сессиям — определяют заранее
  • В ClickHouse есть windowFunnel, в продуктовой аналитике — готовые отчёты

А ещё Знаменатель: все, кто начал воронку, а не все пользователи

Подробно

Упрощение в примере: берётся первое событие каждого шага. Для точной воронки по сессиям или с повторными попытками нужен поиск последовательности (сначала просмотр, потом корзина после этого просмотра) — оконными функциями или специализированными функциями хранилища.

Решения, которые нужно оговорить:

  • строгий порядок шагов или любой;
  • окно конверсии (час, день, неделя);
  • единица — пользователь, сессия или заказ;
  • что делать с пользователями, начавшими в конце периода (ещё не успели сконвертироваться).

Интерпретация: самое большое падение между шагами — кандидат для исследования, но сначала проверяют трекинг: «потерянный» шаг часто означает неотправленное событие, а не реальный отток.

Пример

WITH steps AS (
  SELECT user_id,
    MIN(event_time) FILTER (WHERE event = 'view_item')   AS t_view,
    MIN(event_time) FILTER (WHERE event = 'add_to_cart') AS t_cart,
    MIN(event_time) FILTER (WHERE event = 'purchase')    AS t_buy
  FROM events
  WHERE event_time >= DATE '2026-09-01'
  GROUP BY user_id
)
SELECT
  COUNT(t_view) AS viewed,
  COUNT(*) FILTER (WHERE t_cart >= t_view AND t_cart < t_view + INTERVAL '7 day') AS carted,
  COUNT(*) FILTER (WHERE t_buy >= t_cart AND t_cart >= t_view
                     AND t_buy < t_view + INTERVAL '7 day') AS bought
FROM steps;

Что хотят услышать

  • Порядок шагов и окно конверсии.
  • Подсчёт по пользователям и доли.
  • Проверка корректности трекинга.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Посчитать число событий каждого типа за период и поделить соседние значения — это и есть конверсия воронки по шагам
  • ✗Порядок шагов не важен, главное — факт события
  • ✗Окно времени между шагами не нужно
  • ✓Для каждого пользователя проверить шаги в правильном порядке и в пределах окна, затем считать пользователей

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования