此题共包含一张表:

表1:tb_user_log

要解决的问题:

问题:统计每天的日活数及新用户占比

注: 新用户占比=当天的新用户数÷当天活跃用户数(日活数)。 如果in_time-进入时间和out_time-离开时间跨天了,在两天里都记为该用户活跃过。 新用户占比保留2位小数,结果按日期升序排序。

解题思路:

  1. 首先解决in_time和out_time跨天的情况,用union将表连接备用
  2. 用窗口函数,获取UID出现次数和每日活跃的用户数
  3. 取窗口函数中,出现排名为1的用户作为当天新用户,取每日最大的活跃数作为当天活跃数
  4. 按结果要求,将3的结果保留2位小数,并按日期升序排序
select d, max(cnt) dau, ROUND(sum(if(rank1=1, 1, 0))/max(cnt),2) uv_new_ratio
from(
    select uid,
    d,
    ROW_NUMBER() over (PARTITION by uid ORDER BY d) rank1,
    count(uid) over (PARTITION by d order by uid) cnt
    from(
        SELECT uid, date(in_time) d
        from tb_user_log
        UNION
        SELECT uid, date(out_time) d
        from tb_user_log
    ) temp
) rank_table
group by d
ORDER BY d