Retention первого дня в SQL — доля регистраций, активных на следующий день
Таблица signups(user_id, signup_date) содержит по одной строке на пользователя. Таблица activity(user_id, activity_date) — по одной строке на активный день пользователя. Верните одно число — долю регистраций, у которых была активность ровно через день после регистрации (retention первого дня), округлённую до сотых.
-- одно число: retention первого дня как процент от всех регистраций
Напишите запрос.
LEFT JOIN activity по activity_date = signup_date + 1, затем делят число совпавших уникальных пользователей на все регистрации. LEFT JOIN держит невернувшихся в знаменателе, поэтому это доля вернувшихся от всей когорты регистраций, а не только от вернувшихся.
- ✗Брать INNER JOIN, который убирает невернувшихся из знаменателя
- ✗Считать любую позднюю активность вместо ровно следующего дня
- ✗Делить строки активности, а не уникальных пользователей
- →Как расширить это до retention дня 7 или дня 30?
- →Почему INNER JOIN незаметно меняет здесь знаменатель?
Match each signup to activity on the day after signup, keeping every signup with a LEFT JOIN so users who never came back still count in the denominator:
SELECT ROUND(
100.0 * COUNT(DISTINCT a.user_id) / COUNT(DISTINCT s.user_id),
2) AS d1_retention_pct
FROM signups s
LEFT JOIN activity a
ON a.user_id = s.user_id
AND a.activity_date = s.signup_date + 1;
s.signup_date + 1 is date arithmetic (a date plus an integer is the next date). COUNT(DISTINCT a.user_id) counts signups who were active on day 1; the LEFT JOIN keeps all signups so the denominator is the full cohort. An INNER JOIN would collapse the denominator to returners only and report a meaningless ~100%.