Запрос называется «недельный retention», но считает другое
Аналитик прислал запрос и подписал его как недельный retention продукта:
SELECT COUNT(DISTINCT e.user_id) * 1.0
/ (SELECT COUNT(*) FROM users) AS retention
FROM events e
WHERE e.event_date >= CURRENT_DATE - INTERVAL '7 day'
Вы видите, что число месяц от месяца падает, хотя продукт растёт. В чём дело?
- COUNT(DISTINCT ...) в числителе занижает результат: пользователя нужно считать по числу его событий.
- Фильтр по дате должен стоять в HAVING, иначе часть событий за неделю не попадёт в выборку.
- Умножение на 1.0 теряет точность на больших числах: результат надо явно приводить к типу decimal.
- В знаменателе — все зарегистрированные за всю историю, а не когорта: с ростом базы метрика падает сама по себе.
