#需求:找到每类试卷得分的前3名
#输出:tid(试卷类别)、uid(用户)、ranking(类别排名)
#要求:如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者;输出按ranking排序
#要用到的字段:tag、uid、score
#思路:一是表连接,二是开窗得到每类试卷的分数排名;疑点在于,如果直接limit 3,会只筛选所有结果的前三,怎么做到输出每类试卷的前三;
#解疑:开窗得到排名1,2,3..,where限制输出范围
select tid,uid,ranking
from(
    select tag tid,uid,
    row_number()over(partition by tag order by max(score) desc,min(score) desc,uid desc) ranking
    #未解决的疑问点:这里如果不加上要求中的排序,只order by score,会显示执行出错score不在group by中,但这样在取数上与加上排序要求的情况并无本质区别,这一点疑问没有解决
    from exam_record join examination_info using(exam_id)
    group by 1,2
) w1
#这里group by后要对ranking筛选,但having是和group by一起用的,不能直接对窗口函数进行having操作,所以要嵌套一层子查询
where ranking<=3