每日新用户数:先求首登日再按日统计
LeetCode 1107 · 首次行为、分组两次
面试怎么回答
先在全量 login 记录上按用户求 MIN(activity_date) 得到首登日,再过滤首登日在近 90 天内,最后按首登日 COUNT。关键是先求首登日再限定时间窗口,顺序反了会把老用户算成新用户。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
流量表记录用户的各种行为(登录、登出、浏览等)和日期。假设今天是 2019-06-30,统计最近 90 天内每天首次登录的用户数(只显示有新用户的日期)。
表结构
- Traffic:user_id、activity、activity_date;没有主键,可能有重复行
思路
「首次登录」要基于全部历史求:先只看 login 行为,按用户求最早登录日;然后筛选首登日在最近 90 天内的用户,再按首登日分组计数。顺序不能反:如果先限制 90 天再求最早日期,老用户在 90 天内的第一次登录会被误当成新用户。
参考解法
select login_date,count(*) user_count
from(
select user_id,min(activity_date) login_date
from Traffic
where activity = 'login'
group by user_id
having login_date>= DATE_ADD('2019-06-30',INTERVAL -90 DAY)
)t1
group by login_date
易错点
- 先过滤日期范围再求 MIN,会把老用户误判成新用户。
- 只统计 login 行为,其他行为不算首次登录。