select uid, count(start_time) as exam_complete_cnt
from
  (select*,
    dense_rank() 
    over(partition by uid order by date_format(start_time, '%Y-%m')desc) as rk
    from exam_record
  ) as t1
where rk <= 3
group by uid
having count(start_time) = count(submit_time)
order by
  exam_complete_cnt desc,
  uid desc

1、本题重点在于找到近三个月的作答记录 以及 筛掉近三个月未作答的用户

2、注意筛选月份时要倒序排序,因此月份大的排在前面

3、此处使用dense_rank()函数是因为dense_rank()函数是连续排序

4、比如筛选出的数据分别是'2021-10' '2021-09' '2021-09' '2021-08'这几个月的数据,那么用dense_rank()函数排序就为1、2、2、3;用rank()函数排序就为1、2、2、4;显然会出现错误