select distinct 列1 from ( select 列1, lead(列1,1) over(order by 序号) as 列2, lead(列1,2) over(order by 序号) as 列3, ... lead(列1,n-1) over(order by 列) as 列n, from 表名 ) as a where (a.列1 = a.列2 and ... and a.列1 = a.列n);
select *, lead(日期,1,'当月最后登陆日期') over(partition by 月, 用户id order by 每个月登陆顺序) as 用户当月下一个登陆日期 from ( select 用户id, month(日期) as 月, 日期, row_number() over (partition by month(日期), 用户id order by 日期) as 每个月登陆顺序 from 用户登陆记录表 ) as t1;
可以看出,当连续终止时,即:
1)“日期”与“用户当月下一个登陆日期”相差大于一天;
2)“用户当月下一个登陆日期”等于“当月最后登陆日期”;
两种情况。
将这两种情况过滤出来之后,用户连续登陆天数为:当前登陆顺序减去上一个登陆顺序。
select *, lag(每个月登陆顺序,1) over(partition by 月, 用户id order by 每个月登陆顺序) as 上一个登陆顺序 from ( select *, lead(日期,1,'当月最后登陆日期') over(partition by 月, 用户id order by 每个月登陆顺序) as 用户当月下一个登陆日期 from ( select 用户id, month(日期) as 月, 日期, row_number() over (partition by month(日期), 用户id order by 日期) as 每个月登陆顺序 from 用户登陆记录表 ) as t1 ) as t2 where date_sub(用户当月下一个登陆日期,interval 1 day) <> 日期 or 用户当月下一个登陆日期 = '当月最后登陆日期';
select 月, 用户id, max(连续登陆天数) as 连续登陆的最多天数 from ( select *, 每个月登陆顺序 - coalesce(lag(每个月登陆顺序,1) over(partition by 月, 用户id order by 每个月登陆顺序),0) as 连续登陆天数 from ( select *, lead(日期,1,'当月最后登陆日期') over(partition by 月, 用户id order by 每个月登陆顺序) as 用户当月下一个登陆日期 from ( select 用户id, month(日期) as 月, 日期, row_number() over (partition by month(日期), 用户id order by 日期) as 每个月登陆顺序 from 用户登陆记录表 ) as t1 ) as t2 where date_sub(用户当月下一个登陆日期,interval 1 day) <> 日期 or 用户当月下一个登陆日期 = '当月最后登陆日期' ) as t3 group by 月,用户id;