题解 | #每天的日活数及新用户占比#
每天的日活数及新用户占比
http://www.nowcoder.com/practice/dbbc9b03794a48f6b34f1131b1a903eb
# 虽然嵌套的表有点多,但是从逻辑上来说自己觉得非常清晰:
# 1.计算用户第一次登录的时间
# 2.根据1计算每天的新用户数
# 3.计算每日活跃用户数
# 4.把每日活跃用户数和每天的新用户数做连接,连接条件是日期
# 5.计算新用户数/活跃用户数,因为连接的两个表里面都已经按照日期分组了,所以连接后的表不需要再分组了
# 1.计算用户第一次登录的时间
# 2.根据1计算每天的新用户数
# 3.计算每日活跃用户数
# 4.把每日活跃用户数和每天的新用户数做连接,连接条件是日期
# 5.计算新用户数/活跃用户数,因为连接的两个表里面都已经按照日期分组了,所以连接后的表不需要再分组了
select t2.dt,dau,ifnull(round(new_user/dau,2),0) uv_new_ratio
from(-- 每天的新用户数
select dt,count(1) new_user
from(
-- 用户第一次登录时间
select uid,min(date(in_time)) dt
from tb_user_log
group by uid)t
group by dt
)t1
-- 因为有可能某天没有新用户数,因此要右连接
right join(
-- 每日活跃用户数
select dt,count(distinct uid) dau
from(
select uid,date(in_time) dt from tb_user_log -- 先在里面date()
union all
select uid,date(out_time) dt from tb_user_log
)t
group by dt
)t2
on t1.dt=t2.dt