В следующем запросе показано 30-дневное удержание по месяцам, которое отвечает на вопрос: «Для всех пользователей, которые зарегистрировались в течение месяца, сколько человек совершило покупку через 30 дней после регистрации в аккаунте?»
with user_signups as (
select user_id, cast(account_signup as date) as account_signup_date from <signup_table>
),
most_recent_purchase as (
select user_id, max(cast(timestamp as date)) as most_recent_purchase_date from <purchase_table> group by 1
),
joined as (
select
user_id,
account_signup_date,
most_recent_purchase_date,
date_diff(most_recent_purchase_date,account_signup_date,DAY) as retained_days
from user_signups
inner join most_recent_purchase using(user_id)
),
prep as (
select
format_date('%Y-%m', account_signup_date) as signupYYYYMM
count(*) as users,
sum(case when retained_days >= 30 then 1 else 0 end) as retained_users_30
from joined
group by 1
)
select
signupYYYYMM,
users,
retained_users_30/users as retention_30_days
from prep
order by 1
Надеюсь, вы сможете увидеть, как это можно изменить для еженедельных или ежегодных когорт и разных периодов хранения.
Несколько предостережений ... этот запрос предполагает, что все пользователи, которые создали учетную запись, совершили покупку. Если есть пользователи аккаунта, которые не совершали покупки, вам может потребоваться оставить присоединение, и вам может потребоваться изменить расчет / определение срока хранения (в зависимости от бизнес-целей).