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即可。