Нужно ли группировать по первой дате визита для получения даты когорты?
Что проверяют
Умеете ли вы посчитать когорту руками, а не только пересказать определение. Ключевая деталь в том, что дата когорты это агрегат по пользователю, а не поле конкретной строки визита, и на этом вопрос и построен.
Как отвечать
Ответ утвердительный с поправкой: группировать надо не строки визитов, а пользователей. Сначала считаем на каждого min даты события, округляем до месяца или недели, и только потом джойним обратно к фактам. Если написать group by user_id, visit_date, получится строка на каждый визит, и когорты не будет вовсе.
with first_visit as (
select user_id, date_trunc('month', min(visit_date)) as cohort
from visits
group by user_id
)
select f.cohort,
date_trunc('month', v.visit_date) as period,
count(distinct v.user_id) as users
from visits v
join first_visit f using (user_id)
group by 1, 2;Дальше проговорите договорённости, за ними и следят на собеседовании. Что считать первым событием, зависит от вопроса: регистрация, первый визит или первая покупка дают разные когорты. Ширина окна выбирается под длину цикла покупки. Считать надо не по календарю, а по возрасту когорты: месяц ноль, первый, второй, иначе свежие когорты выглядят хуже старых просто потому, что прожили меньше.
Где спотыкаются
Считают min уже по отфильтрованному куску данных. Ограничили выборку последним кварталом, и пользователь, пришедший год назад, получает новую дату первого визита, а удержание волшебным образом улучшается.
Второе: пишут count(*) вместо count(distinct user_id). В когортной таблице считают людей, а не события, иначе активный пользователь с двадцатью визитами перевешивает целую когорту.
Третье: сравнивают неполные когорты с полными. Последний месяц ещё набирается, его нижние значения не деградация, и такие ячейки либо помечают, либо не показывают.