0 本题好像蛮简单的,思路大的框架如下:
- 求出每天活跃的用户数,即每天的dau
- 求出每天的新用户数。
1 求每天有哪些活跃的用户,这里记作a表。
因为涉及到同一个用户跨天活跃,所以这里union解决。
select uid,date(in_time) dt from tb_user_log
union
select uid,date(out_time) dt from tb_user_log
group by uid,dt
2 求出每一个用户第一次登录的日期,记作b表。
select uid,min(date(in_time)) dt from tb_user_log group by uid
3 连接a表和b表
a表和b需要使用日期连接起来,因为要确保DAU和新增用户两者是在同一个日期
4 最后:每天的新增用户数除以每天的总活跃人数
完整答案:
select a.dt,
count(distinct a.uid) dau,
round(count(distinct b.uid)/count(distinct a.uid),2) uv_new_ratio
from
(select uid,date(in_time) dt from tb_user_log
union
select uid,date(out_time) dt from tb_user_log
group by uid,dt
) a
left join
(select uid,min(date(in_time)) dt
from tb_user_log
group by uid
) b
on a.dt=b.dt
group by a.dt
order by a.dt;