with early_enter_table as ( select uid,min(date(in_time)) as early_time from tb_user_log group by uid ) -- 最早进入系统的时间 , active_time_table as ( select date(in_time) as active_time,uid from tb_user_log group by date(in_time),uid union select date(out_time) as active_time,uid from tb_user_log group by date(out_time),uid ) select a.active_time,count(*), round(count(b.uid) / count(*),2) from active_time_table a left join early_enter_table b on a.active_time = b.early_time and a.uid = b.uid group by a.active_time
建立一个最早进入系统的表,记录每个用户最早进入系统的日期
再建立一个活跃表,由于可能存在跨天的情况,所以活跃表由进入时间和退出时间的日期组成
再通过活跃表左连接最早进入系统的时间表,按日期和用户id进行连接,空集则说明不是新用户,如果非空则说明在当天是新用户
所以按日期分组再使用count计数就能得到每天的总人数和新用户数,相除即可得到结果