select uid,cntSum as exam_complete_cnt from (
select uid,
sum(case when rankNum >=1 then 1 else 0 end) rankSum,
sum(case when cnt >= 1 then 1 else 0 end) cntSum
from (
select uid,
dense_rank() over(partition  by uid order by DATE_FORMAT(start_time,"%Y%m") desc) as rankNum,
case when score is not null then 1
else 0 
end cnt
from exam_record er)t 
where t.rankNum <= 3
group by uid)t1 where rankSum = cntSum
order by exam_complete_cnt desc ,uid desc

根据uid用dense_rank函数对用户分桶后按年份降序排序,然后过滤出前三名用户。最后再根据排名个数等于答题数捞出符合条件的uid。结果按照答题数用户号降序。