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

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

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

select r.exam_id, count(distinct uid) 'uv',round(sum(score)/count(uid),1) 'avg_score'
from exam_record r left join examination_info i on r.exam_id = i.exam_id
where uid in
(select uid
from user_info 
where level >5)
and submit_time is not null 
and date(submit_time) = date(release_time)
and tag = 'SQL'
group by r.exam_id
order by uv desc,avg_score asc

我一直认为,做题也要形成自己的思维框架,利用框架解决不同的问题,形成自己的思维模式。在此分享一下自己的问题分析方法,解决问题的思路流程:

第一步:首先读题,看表中各个字段都有了了解。特别对于一些null 要敏感一些。

第二步:仔细读题,明确题目

1.找到需要的字段:

三张表中字段一大堆,不可能都用得到,只需要根据题目,明确一下自己需要哪些字段,舍弃那些字段。

而需要用到的字段我分为两三大类:

1)直接字段:题目中显式给出的一些限定条件:比如根据本题描述:需要每张SQL试卷,用户等级>5,那么在这句话描述中我们需要的字段就是examination_info.tag,user_info.level。

2)间接字段:比如该题描述,当天5级以上的用户作答的人数uv和平均分avg_score,那么‘当天’就是一个间接条件,我们需要用什么来判断这个当天呢?显然是试卷发布日期=提交日期。用户作答的人数,平均分也是一个道理。

3:隐藏字段:就是需要我们推理得出的字段,例如 本题要算平均分avg_score,首先得把试卷提交了,才能有分数,因此用提交时间是否为空来判断是否有分数(这有一个trick:找到导致没分数的因,是因为没提交才没分数,所以最好用提交时间去判断,而不是用没有分数去判断)

2.把各个字段放到对应的地方

例如输出的字段,就要放到select上;用来限定条件的字段,就要放到where中,例如tag,level;需要分组的字段放到group by;用来排序的条件放到order by 中。

3.最后回顾一遍题:做到不重不漏,小心暗坑。1.当不明确某些描述时,例如是否应该去重计算呢?最好看一下题目中给出的例子,本题就是一个人当天做了两遍试卷,不用去重。

本次分析题目所采用的角度:先横向分析,再纵向顺流程,希望大家批评指正!

全部评论

相关推荐

02-12 00:59
已编辑
哈尔滨工业大学 产品经理
华为 软件开发岗 20.6*16薪 本科
点赞 评论 收藏
分享
头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务