题解 | #统计活跃间隔对用户分级结果#

统计活跃间隔对用户分级结果

https://www.nowcoder.com/practice/6765b4a4f260455bae513a60b6eed0af

# 字段:user_grade 和 ratio
# 忠实用户:近7天活跃过且非新晋用户、新晋用户(近7天新增)、
# 沉睡用户(近7天未活跃但更早前活跃过)、流失用户(近30天未活跃但更早前活跃过)

# tb1:筛选最近的时间点/uid
with tb1 as(
    select uid, max(date(in_time)) as day1, min(date(in_time)) as day2
    from  tb_user_log
    group by uid
),
# tb2:选出最大时间
tb2 as(
    select max(day1) as max_day
    from tb1
),
# tb3:时间差 // 判断是否新用户
# 新用户定义:今天内新增(最早时间点day2与最近时间点day1的时间差小于等于7)
tb3 as(
    select uid,
    TIMESTAMPDIFF(DAY, day1, max_day) as day_diff,day1,day2,
    # 判断是否新用户
    if(timestampdiff(day,day2,day1)<=7,1,0) as if_new
    from tb1 join tb2 
),
# tb4:定义用户分层(根据最近登录时间day_diff 和 是否是新用户if_new)
# 忠实用户:近七天活跃day_diff<=6 且 非新用户if_new = 0
# 新晋用户:近七天活跃day_diff<=6 且 新用户if_new = 1
# 沉睡用户:近七天未活跃day_diff>=6 且 三十天内活跃 day_diff<=29
# 流失用户:三十天内未活跃day_diff > 29
tb4 as(
select uid,
    case 
    when day_diff<=6 and if_new = 0 then '忠实用户'
    when day_diff<=6 and if_new = 1 then '新晋用户'
    when day_diff>=6 and day_diff<=29 then '沉睡用户'
    when day_diff > 29 then '流失用户' end as user_grade
    from tb3
)
# 查询结果
select user_grade,
round(count(uid)/(select count(distinct uid) from tb4),2) as ratio
from tb4
group by user_grade
order by ratio desc



全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务