题解 | #每天的日活数及新用户占比#
每天的日活数及新用户占比
https://www.nowcoder.com/practice/dbbc9b03794a48f6b34f1131b1a903eb
with t1 as ( select uid,date(in_time)dt,min(date(in_time))over(partition by uid)new_dt from tb_user_log union select uid,date(out_time)dt,min(date(in_time))over(partition by uid)new_dt from tb_user_log ) select t1.dt,count(distinct t1.uid)dau, round(sum(if(dt=new_dt,1,0))/count(distinct t1.uid),2)uv_new_ratio from t1 group by dt order by dt asc
1.要求出新用户以及新用户中当天又活跃了的人数,先从原表中查询出uid、根据登录时间格式化后的日期、最小的登录时间(即成为新用户的时间),要用min(date(in_time))over(),由于题目说明in_time和out_time中都算活跃,所以查出in_time和out_time将其union起来得到用户活跃表,其中包含字段uid、用户活跃时间dt、用户成为新用户时间new_dt
2.需求为求出每天日活数以及新用户在每天日活数之中的占比,先求出每天日活数,表t1中count(distinct t1.uid)即是用户活跃数,后面对日期dt分组并排序即可。
3.然后求新用户数在每天日活数中的占比,若表t1中dt字段和new_dt字段相等,说明成为新用户的时间就是用户活跃的时间,即为我们所要的,将其记为1,否则记为0,用sum(if(dt=new_dt,1,0))求得新用户数,将其除以t1中活跃的用户数再取小数点后两位即为新用户在每天活跃用户数中的占比。