题解 | #对试卷得分做min-max归一化#
对试卷得分做min-max归一化
https://www.nowcoder.com/practice/2b7acdc7d1b9435bac377c1dcb3085d6
(一)、非聚类窗口函数代码
select uid,exam_id ,round(sum(max_min)/count(max_min),0) as avg_new_score from ( select exam_id ,uid ,if(score_max=score_min,score,((score-score_min)/(score_max-score_min))*100) as max_min from (select * from (select exam_id ,uid ,score from exam_record where exam_id in (select exam_id from examination_info where difficulty='hard') and score is not null ) as t1 left join ( select exam_id ,min(score) as score_min ,max(score) as score_max from exam_record where exam_id in (select exam_id from examination_info where difficulty='hard') and score is not null group by exam_id ) as t2 using(exam_id) ) as tt1 ) as ttt1 group by exam_id,uid order by exam_id,avg_new_score desc;
(二)、解释
1、思路
高难度和有分数的试卷求出分数、(这套试卷的)最高分数、(这套试卷的)最低分数——将求出的分数、最高、最低分代入公式归化——将归化好的数值进行求平均
2、代码解释
11行-41行
score,score_min,score_max无法放到同一个查询里,因为最大值和最小值需要exam_id 的聚合运算,score不需要,所以需要两个查询来查询,然后再进行连接
9行
如果某个试卷作答记录中只有一个得分,那么无需使用公式
当min(score)=max(score)那就说明只有一个得分
3行
求平均值的一种方法,求和/数数
#MySQL#