with t as (
-- 创建一个CTE(公用表表达式),用于计算每个用户的日期差异
select
user_id,
date_sub(log_time, interval rk day) as date_diff -- 计算每个登录日期减去行号的日期差异
from (
-- 内部查询:为每个用户的登录记录分配一个行号
select
user_id,
date(log_time) as log_time, -- 提取日期部分
row_number() over (partition by user_id order by log_time) as rk -- 为每个用户按日期分配行号
from
login_tb
where
user_id in (select user_id from register_tb) -- 仅考虑已注册用户的登录记录
) as a
)
-- 主查询:查找具有连续三天或更多天登录的用户
select
user_id
from
t
group by
user_id, date_diff -- 按用户和日期差异分组
having
count(date_diff) >= 3 -- 只选择连续登录天数达到3天或以上的组
order by
user_id; -- 按用户ID排序