select *
from(
#2、确定对关联后数据表的取数需求#
select t2.tag,t1.uid,
#解释:首先,根据结果倒推需求,由于展示结果的ranking字段的排序位次唯一,因此用row_number进行排序;其次,由于结果是对同一tag内进行的位次排序,而原数据表又未按照tag进行分组,因此在排序时要主动对tag进行分组(注意:partition优先级<group by,是对group by后的数据进行的处理);再次,在排序之前,我们要知道在不同tag组之内(SQL&算法两大组),由于每1位用户在同1类别试卷中,可能会有多次试卷得分,而我们的结果是“比较不同用户在同1类别中的max得分”(即使某位用户在1个类别中得分全是最高分,它也只能取max_score————在1个类别中1位用户在多次答题中的最高分唯1,然后拿来与其他用户max_score分进行比较),我们则要将“每1位用户在同1类别中的试卷多次得分”转换成“每1位用户在同1类别中的试卷最高得分”,这样再拿“同1类别中、不同用户的试卷max_score”进行比较,这就是为什么用max(score) desc作为排序条件(由于前面挑选的展示字段tag,uid,和后面的分组统计group by函数<窗口函数优先级<group by函数>,这里的max_score会取同一tag中,不同uid的max_score),然后max_score一致时再按照max(min_score)进行比较,这就是为什么用min(score) desc,若还相同,则按照uid从大到小进行排序。(由于row_number的位次唯一性,因此得到的排序顺序必唯一)#
row_number() over(partition by t2.tag order by max(score) desc,min(score) desc,uid desc) as ranking
#1、确定需求来源的数据表#
from exam_record as t1
left join examination_info as t2
on t1.exam_id = t2.exam_id
#2、同时进行分组统计#
group by 1,2) as t3
#3、对结果筛选出排名前3的数据#
where t3.ranking <= 3;