题解 | #试卷发布当天作答人数和平均分#

试卷发布当天作答人数和平均分

https://www.nowcoder.com/practice/5b58e89556dc4153a79d8cf8c08ba499

这个题我错了一次,没有考虑到如果作答表某条记录没有被提交,是不能算作一次作答次数的,已经确定了如此。

做了但是没有被提交的答题记录,我这里是把这样的用户算入uv的,你可以看到我左后uv字段只是去了个重,还有两个日期比较时用的是start_time。但是没有被提交的答题记录,在计算平均分数的时候,是不能被计算进去的,算进去一定会错。

#STEP1:以下是某张试卷的基本条件分析(某张卷子)
    #SQL类别试卷发布后当天: tag = SQL 且 (exam_record作答表的start_time年月) = (examination_info 试卷信息表release_time年月)的 
    # 只有5级以上的用户会被统计
    # 平均分 = 5级以上用户答这张卷子的所有分数之和/5级以上答题的总次数  (1个5级以上用户可以在同一天多次做答同一张试卷,但是没有提交的卷子不能算一次,提交完成有分数的才算一次)

#STEP2: 首先将作答表和用户表连起来,条件: a.uid = b.uid and b.level > 5  结果记作A
#       A RIGHT join 过滤后只含有SQL记录的试卷表 (因为试卷表可能在发布这一天没有人做答,所以要保留,保守一下就这样认为不会亏) 条件:c.exam_id = a.exam_id and date_format(a.start_time,'%Y%m')=date_format(c.release_time,'%Y%m')

#step3: 根据c.exam_id分组计算即可(很多张不同的SQL试卷)
select
a.exam_id,count(distinct a.uid) as uv, format(sum(a.score)/sum(case when a.submit_time is not null then 1 else 0 end),1) as avg_score
from exam_record a 
join user_info b on a.uid = b.uid and b.level > 5 
right join (select * from examination_info where tag='SQL')  c on c.exam_id = a.exam_id and date_format(a.start_time,'%Y%m')=date_format(c.release_time,'%Y%m')
group by c.exam_id
order by uv desc,avg_score

group by我采用了c.exam_id其实是我考虑到有些SQL卷子可能发布当天没有成功作答记录的情况

全部评论

相关推荐

冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务