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计数就能得到每天的总人数和新用户数,相除即可得到结果



京公网安备 11010502036488号