select
user_id
from
(
select
rt.user_id,
lt.log_time,
day (lt.log_time) - row_number() over (
partition by
rt.user_id
order by
lt.log_time
) as start_no
from
register_tb as rt
inner join login_tb as lt on rt.user_id = lt.user_id
) as level1
group by
user_id,
start_no
having
count(*) >= 3
我认为本解法的核心就在于:将每一个user_id对应的登录信息分组排列,然后使用ROW_NUMBER()窗口函数对登陆日期进行排名as rank,如果某些天是连续的,那么其对应的日期减去rank结果,应该是一致的,比如2025-3-13减去1与2025-3-14减去2对应的结果均是2025-3-12 as start_no,然后再将上面的结果作为子查询表,在父查询里按照user_id与start_day进行分组排列,然后在HAVING里写条件count(*)>=3,找出对应的user_id即可。

京公网安备 11010502036488号