此题共包含一张表:
表1:tb_user_log
要解决的问题:
问题:统计每天的日活数及新用户占比
注: 新用户占比=当天的新用户数÷当天活跃用户数(日活数)。 如果in_time-进入时间和out_time-离开时间跨天了,在两天里都记为该用户活跃过。 新用户占比保留2位小数,结果按日期升序排序。
解题思路:
- 首先解决in_time和out_time跨天的情况,用union将表连接备用
- 用窗口函数,获取UID出现次数和每日活跃的用户数
- 取窗口函数中,出现排名为1的用户作为当天新用户,取每日最大的活跃数作为当天活跃数
- 按结果要求,将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