题解 | #0级用户高难度试卷的平均用时和平均得分#
0级用户高难度试卷的平均用时和平均得分
http://www.nowcoder.com/practice/bb474c6cbd77478fb6d9fc86934d0ebb
user_info 是a,examination_info 是b,exam_record 是c
select a.uid,
round(avg(if(c.score is null,0,c.score)),0) avg_score,
round(avg(if(timestampdiff(minute,start_time,submit_time) is null,b.duration,timestampdiff(minute,start_time,submit_time))),1) avg_time_took
from user_info a,examination_info b,exam_record c
where a.level='0'
and b.difficulty='hard'
and a.uid=c.uid
and b.exam_id=c.exam_id
group by a.uid;
解题分析:这道题个人感觉主要考的就是计算时间差以及if函数的使用, 看第一个平均得分,如果未完成的就是0分,用if可以这样写
if(得分是0,0,实际得分)
实际语句为:
if(c.score is null,0,c.score)
第二个平均时间,需要用到timestampdiff函数,可以这样写,因为是算的分钟数所以用minute
TIMESTAMPDIFF(minute,开始时间,结束时间)
其中结束时间有的是null,所以需要用到if语句来做判断:
if(timestampdiff比较后的结果为空值,examination_info表中的考试时长,timestampdiff比较后的值)
实际语句为:
if(timestampdiff(minute,start_time,submit_time) is null,b.duration,timestampdiff(minute,start_time,submit_time))
后面就是一些需要做的判断了,例:用户等级为0,试卷难度为hard ,还有就是uid和exam_id需要两两相等,最后加上group by完成
用round设置保留小数位数,avg求平均值这个不用说