# 第四次 根据首次登陆时间 即最开始的first_time聚合,通过sum计算第二天活跃人数,通过count计算新用户总数(注意:由于第三次子查询已经对uid进行聚合了,所以此次不需要再使用distinct去重) select c.dt, round(sum(c.cnt)/count(c.uid),2) as rate from # 第三次子查询,通过用户uid聚合,判断该用户是否为第二天活跃用户,若是则赋值为1(此步为去除新用户第二天多次登录的重复记录) (select b.uid,date_format(b.first_time,'%Y-%m-%d') as dt, if(sum(cnt)>=1,1,0) as cnt from # 第二次子查询,通过判断登陆时间和首次登陆时间的差是否为1,或者登录登出时间差是否大于等于1确定该用户是否为次日登录的活跃用户(注意:这时可能存在新用户第二天多次登录的情况) (select a.*, if(datediff(a.in_time,a.first_time)=1 or (datediff(a.out_time,a.in_time)=1 and a.in_time=a.first_time),1,0) as cnt from # 第一次子查询,使用开窗函数确定每个用户的首次登陆时间,记为first_time (select tu.*, min(in_time) over(partition by tu.uid) as first_time from tb_user_log tu) as a) as b group by b.uid,b.first_time) as c group by c.dt having date_format(c.dt,'%Y-%m')='2021-11' ;
四次子查询,可以在本地从第一层开始运行,通过实例理解

京公网安备 11010502036488号