select uid, count(score) as exam_complete_cnt
from
(select uid, start_time, submit_time, score, dense_rank() over(partition by uid order by date_format(start_time, '%Y%m') desc) as ranking
from exam_record) t1 
where t1.ranking <= 3
group by uid
having count(start_time) = count(submit_time)
order by exam_complete_cnt desc, uid desc
;
这道题刚开始做的时候,我是先进行拆解,先查出学生近三个月的的uid,开始做题时间,提交时间,以及成绩,用窗口函数按照uid进行分组,按照月份的降序进行分组,这样就能得出每个学生最近做题的时间。然后将这个时间排序作为一个t1表供查询,在t1外面套一个查询,进行count计算每个学生完成试卷的数量(exam_complete_cnt)。