0 本题好像蛮简单的,思路大的框架如下:

  1. 求出每天活跃的用户数,即每天的dau
  2. 求出每天的新用户数。

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和新增用户两者是在同一个日期 alt

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;