- 利用union在tb_user_log表中,去重找到每天活跃的用户,形成t1表。注:由于in_time与out_time隔天算两天
- 利用窗口函数over()在表t1找到每个用户第一次登录的时间first_time, 形成表t2
- 利用聚合函数group by 对dt聚合,利用count(*)找到每天活跃人数,通过if(dt=first_time, 1, 0)是否为第一次登录,计算日活率uv_new_ratio。
select
dt,
count(*) dau,
round(sum(if(dt=first_time, 1, 0)) / count(*), 2) uv_new_ratio
from
(select
uid,
dt,
min(dt) over(partition by uid) first_time
from
(select
uid,
date(in_time) dt
from
tb_user_log
union
select
uid,
date(out_time) dt
from
tb_user_log) t1 ) t2
group by
dt
order by
dt;