题解 | 查询连续登陆的用户
查询连续登陆的用户
https://www.nowcoder.com/practice/9944210610ec417e94140ac09512a3f5
with a as
(
select
r.user_id,
date(r.reg_time) reg_time,
date(l.log_time) log_time,
ROW_NUMBER() over (partition by r.user_id order by log_time) as rn
from register_tb r
left join login_tb l
on r.user_id = l.user_id
),
b as
(
select
user_id,
DATE_sub(log_time,interval rn day) n_day
from a
)
select user_id
from b
group by user_id,n_day
having count(n_day) > 2
步骤 1:标记用户每次登录的顺序
- 操作:将用户的注册信息(
register_tb)和登录信息(login_tb)关联,为每个用户的每次登录分配一个序号。 - 实现:使用窗口函数
ROW_NUMBER()按用户分组(PARTITION BY user_id),并按注册时间排序(ORDER BY reg_time),生成序号rn(第 1 次登录、第 2 次登录...)。
步骤 2:计算 “预期登录日期”
- 操作:对每个用户的每次登录日期
log_time,加上对应的序号rn天,得到一个新日期n_day。 - 设计意图:如果用户连续登录,例如第 1 天、第 2 天、第 3 天登录,对应的 n_day 会是相同的值。例如:第 1 天登录:log_time + 1 天第 2 天登录:log_time + 1 天第 3 天登录:log_time + 1 天这些 n_day 完全相同,可用于判断连续性。
步骤 3:筛选连续登录超过 2 天的用户
- 操作:按用户分组,统计每个用户的相同
n_day值的出现次数。 - 判断逻辑:如果某个用户的 n_day 中有至少 3 个相同的值,则认为该用户连续登录了 3 天或更久。最终返回满足条件的用户 ID。
#牛客AI配图神器#
