SELECT t.tag, t.uid, t.m from( select e2.tag, e1.uid, dense_rank()over(partition by e2.tag order by max(e1.score) desc,min(e1.score) desc,e1.uid desc) as m from exam_record e1 left join examination_info e2 on e1.exam_id=e2.exam_id group by e2.tag,e1.uid ) as t WHERE t.m<=3 看似简单,其实挺陷阱的,这种题型也挺少见的 按照 tag 进行分组,按照每个人最大分,最小分及用户ID排序 因为有聚合函数要分组 group by tag 和 uid 每个人的TAG 最高分 最小分等