题解 | #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求平均值这个不用说

全部评论

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务