select
            DISTINCT b.user_id
        from    
            (select
                a.user_id,
                date_sub(a.date, interval a.rk DAY) as initial_day
            from   
                (
                    select 
                        r.user_id, 
                        date(l.log_time) as date,
                        row_number() over (partition by r.user_id order by l.log_time asc) as rk
                    from
                        register_tb r 
                        join login_tb l on r.user_id=l.user_id
                ) a 
            ) b
        group by
            b.user_id, b.initial_day
        having
            count(*) >= 3
        order by 
            b.user_id asc

  1. 执行顺序:group by->having->select->distinct
  2. having中可以使用聚合函数,相当于筛选符合条件的组别,对整个组别进行过滤。having不能筛选组内的某几条记录,只能根据聚合后的“整组”结果来保留/丢弃“整个组”