逻辑很简单,就是先用聚合加窗口函数算出归一值,然后再取平均值。

select uid, exam_id, cast(avg(standard) as unsigned) as avg_new_score from

(select uid, exam_id, 
if(count(score) over (partition by exam_id) = 1, score, 
   100*(score - min(score) over (partition by exam_id))/ (max(score) over (partition by exam_id) - min(score) over (partition by exam_id))) as standard
from examination_info inner join exam_record using(exam_id)
where difficulty = "hard" and score is not null) as temp

group by uid, exam_id
order by exam_id, avg_new_score desc