Я просто не уверен, с чего начать
Надеюсь, вы прочитали все мои комментарии и действительно попробовали что-то самостоятельно, но поскольку я не вижу никаких обновлений, я полагаю, что вы все еще застряли здесь - так что мы идем ...
Ниже приведен стандарт SQL для BigQuery, и он должен указывать направление
#standardSQL
WITH temp1 AS (
SELECT user_id,
FORMAT_DATE('%Y-%m', DATE(viewed_at)) month_viewed_at,
DATE_DIFF(DATE(viewed_at), '2000-01-01', MONTH) pos,
DATE_DIFF(DATE(MIN(viewed_at) OVER(PARTITION BY user_id)), '2000-01-01', MONTH) first_pos
FROM `project.dataset.table`
), temp2 AS (
SELECT *, pos = first_pos AS new_user
FROM temp1
), temp3 AS (
SELECT *, LAST_VALUE(new_user) OVER(win) OR pos - 1 = LAST_VALUE(pos) OVER(win) AS retained_user
FROM temp2
WINDOW win AS (PARTITION BY user_id ORDER BY pos RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
)
SELECT month_viewed_at,
COUNTIF(new_user) AS new_users,
COUNTIF(retained_user) AS retained_users
FROM temp3
GROUP BY month_viewed_at
-- ORDER BY month_viewed_at DESC
Если применить к вашему образцу данных - результат
Row month_viewed_at new_users retained_users
1 2019-04 1 1
2 2019-03 1 1
3 2019-02 1 1
4 2019-01 1 0
В temp1
мы подготавливаем данные, форматируя просматриваемый_кат в необходимый формат для представления в выходном объявлении, а также преобразуем его в последовательный номер месяца, начиная с некоторых абстрактных данных (2000-02-02), чтобы мы могли использовать функцию аналитики с ДИАПАЗОН в отличие от ROWS
В temp2
мы просто идентифицируем новых пользователей, а в temp3
- оставшихся пользователей
Я думаю, это может быть хорошим началом, поэтому я оставляю остальное для вас