select t1.dt,user_cnt as dau,cast(if(new_user_cnt is null,0,new_user_cnt)/user_cnt as decimal(10,2)) as uv_new_ratio from 
(
select dt,count(uid) user_cnt from (
    # 若要计算跨天情况 则需要把in_time 和out_time 分隔开来 去重 这样若隔天了 也有值
    select uid,date(in_time) dt from tb_user_log
    union
    select uid,date(out_time) dt from tb_user_log
) as t_user_info
group by dt
) as t1
left join (
select dt,count(*) as new_user_cnt from (
    # 首先需要算出每天的新用户 通过用户登录情况算出
    select uid,min(date(in_time)) dt from tb_user_log group by uid
) as t_new_user_cnt
group by dt
) as t2 
on t1.dt = t2.dt
order by dt;

思路

一、主要算的是新用户,故需要统计新用户信息,就是该用户第一次登录的信息;

二、跨天的信息也要更新,所以i想到把登入、登出的信息全部统计,然后进行去重,这样如果跨天的消息也会被保存。