订阅更新

每日新用户数:先求首登日再按日统计

SQL 实战 123 题 · 第 60 题 中等 约 2 分钟读完

LeetCode 1107 · 首次行为、分组两次

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

先在全量 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 行为,其他行为不算首次登录。
刷题进度保存在当前浏览器