题解 | #月均完成试卷数不小于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分组和排序了。

不容易

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务