select
author_id,author_level,max(days)
from(
select author_id,flag,count(*) as days
from
(
select author_id,
answer_date - rank() over(partition by author_id order by answer_date) as flag
from answer_tb
group by author_id,answer_date
order by author_id,answer_date) t1
group by author_id,flag
having count(*) >= 3
order by days desc) t2 left join author_tb USING(author_id)
group by author_id,author_level
order by author_id

这应该算单独一个"连续登录"问题,看到题目真的没想到咋做.....

借鉴了一下解析的思路:解决思路:使用登陆日期减去日期本身的序号(窗口函数计算得来)得到的就是出发当天的日期,如果有三个出发当天日期相等,则认为是连续登录。

先按用户和日期分组(相当于是对同一个用户和日期的数据做去重处理),然后用窗口函数计算rank之后,得到一个“出发日期”。

此时嵌套一个查询,按用户和出发日期进行分组,目的是计算每个用户的每个出发日期的组内情况,在这里是要找到连续登录3天的数据,于是分组后还要加个having只筛选出数量大于等于3的分组,并且输出他们的数量。

由于题目要求的是最大连续个数,在上一步找到了每个用户的分段连续登录天数之后,只需要再按用户分组,输出max字段的值即是最大的登录天数了。

最后别忘了join用户表输出用户的等级。