with a as(
select uid,exam_id,submit_time,
dense_rank()over(partition by uid order by 
                 date_format(start_time,'%Y-%m-01') desc) rk
from exam_record)
select uid,count(exam_id) exam_complete_cnt from a
where (uid) not in (select uid from a where submit_time is null and rk <=3)
and rk<=3
group by uid 

order by exam_complete_cnt desc,uid desc