题解 | #0级用户高难度试卷的平均用时和平均得分#

0级用户高难度试卷的平均用时和平均得分

http://www.nowcoder.com/practice/bb474c6cbd77478fb6d9fc86934d0ebb

SQL37 0级用户高难度试卷的平均用时和平均得分

题目主要信息:

  • 输出每个0级用户所有的高难度试卷考试平均用时和平均得分,未完成的默认试卷最大考试时长和0分处理

问题拆分:

  • 筛选出每个0级用户高难度题的得分及耗时:
    • 得分信息、用户信息、题目信息分布三个表格中,我们用exam_id将exam_record和examination_info连在一起,再通过uid连上user_info。知识点:join...on...
    • 从连接后的表格中筛选出用户等级为0试题难度为hard的信息。知识点:where
    • 修改得分为空的分数为0。if(score is not null, score, 0) as new_score 知识点:if
    • 计算用户做这份试卷的用时,没有提交时间就设置为试卷限制时间。if(submit_time is not null, timestampdiff(minute, start_time, submit_time), duration) as cost_time 知识点:if、timestampdiff
    • 筛选出来的信息记为new_table
  • 从new_table中筛选出每个用户的平均得分及平均用时,要以uid分组统计。知识点:group by、round()、avg()

代码:

select uid,
       round(avg(new_score), 0) as avg_score,
       round(avg(cost_time), 1) as avg_time_took
from(
    select e_r.uid as uid,
           if(score is not null, score, 0) as new_score,
           if(submit_time is not null, timestampdiff(minute, start_time, submit_time), duration) as cost_time
    from exam_record e_r join examination_info e_i
    on e_r.exam_id = e_i.exam_id
    join user_info u_i
    on e_r.uid = u_i.uid
    where level = 0
    and difficulty = 'hard'
    ) new_table
group by uid
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
timestampdiff 不是前一个减去后一个吗
1 回复 分享
发布于 2022-02-14 15:11
大师 你这个没必要用子查询嵌套呀, 一个查询就搞定了。 优化了下: select e_r.uid as uid, round(avg(ifnull(score,0)),0) as new_score, round(avg(if(submit_time is not null, timestampdiff(minute, start_time, submit_time), duration)),1) as cost_time from exam_record e_r join examination_info e_i on e_r.exam_id = e_i.exam_id join user_info u_i on e_r.uid = u_i.uid where level = 0 and difficulty = 'hard' group by uid
3 回复 分享
发布于 2022-05-05 10:55
select er.uid as uid, avg(if(score is not null,score,0)as avg_score, avg(if(submit_time is not null, timestampdiff(minute,start_time,submit_time),duration)) as avg_time_took from exam_record as er join user_info as ui on ui.uid=er.uid join examination_info as ei on ei.exam_id=er.exam_id where level=0 and difficulty='hard' group by uid; 这个老报错,说有数组越界等异常,到底哪里错了?
点赞 回复 分享
发布于 2024-03-25 16:40 北京
未完成的默认试卷最大考试时长和0分处理, 这个我怎么没见到有处理呢? if里只看到了判空
点赞 回复 分享
发布于 2023-09-11 15:01 陕西
不能用CASE WHEN吗?select uid,round((sum(case when score is null then 0 else score end)/count(start_time)),0) as avg_score,round(sum(case when submit_time is null then duration else timestampdiff(minute,start_time,submit_time) end)/count(start_time),1) as avg_time_took from exam_record left join user_info using(uid) left join examination_info using(exam_id) where level = 0 and difficulty = 'hard' group by uid;
点赞 回复 分享
发布于 2022-11-18 14:17 上海
请问在造表的时候分组,会报错是什么原因呀,如果在造表的时候分组一次,外头筛选的时候也分组一次,报错是什么原因呢 select uid, round(avg(new_score),0)as avg_score, round(avg(cost_time),1)as avg_time_took from(select e_r.uid as uid, if(score is null,0,score) as new_score, if(submit_time is null,duration,timestampdiff(minute,start_time,submit_time)) as cost_time from exam_record e_r left join examination_info e_i on e_i.exam_id=e_r.exam_id left join user_info u_i on u_i.uid=e_r.uid where level =0 and difficulty = 'hard' # group by uid ) new_table group by uid
点赞 回复 分享
发布于 2022-04-08 16:27
select er.uid, round(sum(if(er.submit_time is null,0, er.score))/count(er.start_time),0) as avg_time_took, round(sum(if(er.submit_time is null,ei.duration, timestampdiff(minute,er.start_time,er.submit_time)))/count(er.start_time),1) as avg_score from exam_record er join examination_info ei on er.exam_id=ei.exam_id join user_info ui on er.uid = ui.uid where er.uid in (select uid from user_info where level=0) and er.exam_id in (select exam_id from examination_info where difficulty='hard') group by er.uid
点赞 回复 分享
发布于 2022-02-15 09:49

相关推荐

11-28 16:13
门头沟学院 Java
程序员小白条:年底了,都差不多了
点赞 评论 收藏
分享
评论
18
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务