题解 | #试卷发布当天作答人数和平均分#
试卷发布当天作答人数和平均分
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.当不明确某些描述时,例如是否应该去重计算呢?最好看一下题目中给出的例子,本题就是一个人当天做了两遍试卷,不用去重。
本次分析题目所采用的角度:先横向分析,再纵向顺流程,希望大家批评指正!