/*
 试卷信息表 examination_info
 试卷作答记录表 exam_record
 
 找到每类试卷得分的前3名,
 如果两人最大分数相同,选择最小分数大者,
 如果还相同,选择uid大者。
 */
select
    tid,
    uid,
    ranking
from
    (
        select
            b.tag as tid,
            a.uid,
            row_number() over(partition by b.tag order by max(a.score) desc,min(a.score) desc,a.uid desc) as ranking
        from
            exam_record a
            left join examination_info b using (exam_id)
        where
            a.score is not null
        group by
            b.tag,
            a.uid
    ) a
where
    ranking <= 3