题解 | #某乎问答最大连续回答问题天数大于等于3天的用户及其对应等级#
某乎问答最大连续回答问题天数大于等于3天的用户及其对应等级
https://www.nowcoder.com/practice/e080f8a685bc4af3b47749ca3310f1fd
1. 这道题的难点是如何找到连续的天数,我的做法是先用row_number窗口函数按作者id分组对日期进行排序,为什么不用dense_rank,我们先来看二者的区别:(以101作者为例,前者是用row_number排序,后者是用dense_rank排序)
我们可以发现前者的所有日期在减去它们的名次后为11.00和11.-1(这个日期不合理,但是不重要,重要的是使连续日期变得一样,这样才能计数),而dense_rank窗口函数在减去它们的名次后都为11.00,会出现对2021-11-01这个日期重复计数,即出现四天的连续日期,显然不对
2. 接下来,也就是对日期进行计算,用date_sub这个函数,得到新的日期,连续日期的新日期都是一样的(11.-1)
3. 第三步,题目要求求出连续的天数,所以接下来我们要对刚刚求出来的新日期进行count,有三个11.-1代表连续天数为3天,并且用having函数对连续天数大于等于三天的进行筛选
4. 最后一步,也就是找出最大的连续天数,所以要对上一步求出的连续天数取一个最大值,用max函数即可
完整代码如下:
select author_id,author_level,max(consec_days) as days_cnt
from (
select author_id,author_level,count(diff) as consec_days
from (
select author_id,author_level,
date_sub(answer_date,interval rk day) as diff
from (consec_
select aw.author_id,author_level,answer_date,
row_number() over(partition by aw.author_id order by answer_date) as rk
from author_tb ah
right join answer_tb aw
on ah.author_id=aw.author_id
) as r
) as df
group by author_id,author_level,diff
having count(diff) >=3
) as d
group by author_id,author_level
order by author_id