Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

Пример

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 слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем