计算连续登陆天数 和“SQL41 最长连续登录天数是一样的思路”这道题是一样的思路。
虽然题目中说登录表为单日随机一次登录数据,忽略单日多次登录情况,但考虑到现实情况,代码里还是处理了单日多次登录的这种情况,使用dense_rank() 按日期排序再去重。
with log_info as (
-- 选出登录信息表中的新注册用户,并根据登录日期排序
-- 如果单日多次登录,应算作同一天
SELECT distinct
l.user_id,
date(l.log_time) as log_date,
dense_rank() over(partition by l.user_id order by date(l.log_time) asc) as log_order
FROM login_tb l
where exists (
select user_id from register_tb r where l.user_id = r.user_id
)
),
log_date as (
select
user_id,
log_date,
date_sub(log_date,interval log_order day) as new_date
from log_info
),
consec_log_days as(
-- 计算新注册用户的连续登录谭树
select
user_id,
count(1) as consec_log_days
from log_date
group by user_id,new_date
)
select user_id
from consec_log_days
where consec_log_days>=3
order by user_id
;