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用户表输出用户的等级。