题解 | #月均完成试卷数不小于3的用户爱作答的类别#
月均完成试卷数不小于3的用户爱作答的类别
https://www.nowcoder.com/practice/b1d13efcfa0c4ecea517afbdb9090845
SELECT tag, COUNT(tag) tag_cnt FROM exam_record a JOIN examination_info b USING(exam_id) WHERE uid in (SELECT uid FROM exam_record WHERE submit_time is NOT null GROUP BY uid HAVING COUNT(exam_id)/COUNT(DISTINCT MONTH(start_time)) >= 3 # HAVING COUNT(exam_id)/COUNT(DISTINCT MONTH(submit_time)) >= 3 ) # AND MONTH(submit_time) = 9 # 这个是看到讨论说是求的是9月的,从结果看也不一定是 GROUP BY tag ORDER BY tag_cnt DESC;
题解:
任务:找到试卷类别和被作答次数
限制:目标试卷是被月均完成试卷数大于等于3的用户完成的
按作答次数倒序输出
首先看要什么字段,一个tag和tag_cnt,先选择这个,第二个字段肯定是要用聚合函数的,可以用COUNT(tag)计数,后续再分组计算;
然后联结两个表,这里因为examid两个表都有,所以无所谓内外联结,联结字段就直接用using,比on方便多了;
接下来就是完成限制条件,最开始是尝试建立视图,但是警告我没有权限,折腾了半天还是用子查询了。详细理下子查询的思路:
要定位是哪些用户,所有查uid;是完成了试卷,所以要检查有没有完成(用提交时间),测试过如果是删掉就只能通过一个用例;最后筛选月均完成数,这个让人很不解,倒是是每个月都完成了3个还是平均下来每个月都完成了3个,属于是语言的艺术了。在本题中就是平均下来每个月都完成了3个,所以计算全部完成的数量再除以有几个月即可。注释掉的那个也可以执行,因为前面用where已经过滤了提交时间为null的了。
最后就是tag分组和排序了。
不容易