alt

-- 通用解
select tmp.user_id, min(tmp.login_date) as start_date, max(tmp.login_date) as end_date
  from (select a.user_id,
               a.login_date,
               row_number() over(partition by a.user_id order by a.login_date) as rn,
               a.login_date - row_number() over(partition by a.user_id order by a.login_date) as r
          from ods.t_zipper a
         where a.user_id = 'sunny'
          ) tmp
 group by tmp.user_id,tmp.r
 order by 2
 /*
 这确实是最优解了,你们能看明白吗?
 */

alt