with t as ( SELECT uid,date(start_time) as start_day,exam_id, row_number() over(partition by uid order by start_time) as ranking from exam_record ) SELECT t.uid,max(datediff(t1.start_day,t.start_day)+1) as days_window, count( t.exam_id), round((count( t.exam_id)/(datediff(max(t.start_day),min(t.start_day))+1))*max(datediff(t1.start_day,t.start_day)+1),2) as avg_exam_cnt from t left join t as t1 on t.uid = t1.uid and t.ranking = t1.ranking-1 where year(t.start_day)=2021 group by t.uid having count(distinct date(t.start_day))>=2 order by days_window desc ,avg_exam_cnt desc
这个题的难点有两个
1、找到自联结求窗口值的思路,通过建立排名列作为辅助列来实现
2、平均作答试卷套数的计算
1. 做过的套数 不需要按试卷去重
2. 时间差需要+1天
[[窗口函数]]