with user_base as (
-- 基础用户:Pro用户 + Q1有登录
select distinct
u.user_id,
u.user_name
from users u
inner join user_events ue on u.user_id = ue.user_id
where u.registration_date between '2025-01-01' and '2025-06-30'
and u.plan_type = 'Pro'
and date(ue.event_timestamp) between '2025-01-01' and '2025-03-31'
and ue.event_type = 'login'
)
select
concat(ub.user_name, '(', ub.user_id, ')') as user_profile,
-- 总活动分数(所有事件)
sum(
case when ue.event_type = 'create_task' then 5
when ue.event_type = 'export_report' then 10
when ue.event_type = 'invite_member' then 8
else 1
end
) as total_activity_score,
-- 第一季度月均事件数
round(
sum(case when date(ue.event_timestamp) between '2025-01-01' and '2025-03-31' then 1 else 0 end) / 3,
2
) as avg_monthly_events
from user_base ub
inner join user_events ue on ub.user_id = ue.user_id
group by ub.user_id, ub.user_name
order by total_activity_score desc,
avg_monthly_events desc,
ub.user_id asc
;
# # 1、筛选特定注册人群
# with t1 as (
# select
# user_id,
# user_name
# from users
# where registration_date between '2025-01-01' and '2025-06-30'
# and plan_type = 'Pro'
# ),
# # 2、筛选Q1至少登录一次
# t2 as (
# select
# distinct user_id
# from user_events
# where date(event_timestamp) between '2025-01-01' and '2025-03-31'
# and event_type = 'login'
# ),
# # 3、对事件进行打分
# t3 as (
# select
# ue.user_id,
# t1.user_name,
# event_type,
# case when event_type = 'create_task' then 5
# when event_type = 'export_report' then 10
# when event_type = 'invite_member' then 8
# else 1
# end as score,
# event_timestamp
# from user_events ue
# inner join t1 on ue.user_id = t1.user_id
# inner join t2 on ue.user_id = t2.user_id
# # where date(event_timestamp) between '2025-01-01' and '2025-03-31'
# ),
# # 4、计算一季度月均事件数
# t4 as (
# select
# user_id,
# round(count(event_type)/3, 2) as avg_monthly_events
# from t3
# where date(event_timestamp) between '2025-01-01' and '2025-03-31'
# group by user_id
# ),
# # 5、计算总活跃分数
# t5 as (
# select
# user_id,
# user_name,
# sum(score) as total_activity_score
# from t3
# group by user_id, user_name
# )
# # 6、合并
# select
# concat(t5.user_name, '(', t5.user_id, ')' ) as user_profile,
# t5.total_activity_score,
# t4.avg_monthly_events
# from t5
# left join t4 on t5.user_id = t4.user_id
# order by t5.total_activity_score desc,
# t4.avg_monthly_events desc,
# t5.user_id asc;
# ;