题解 | #统计每个学校各难度的用户平均刷题数#
统计每个学校各难度的用户平均刷题数
https://www.nowcoder.com/practice/5400df085a034f88b2e17941ab338ee8
一步步来,先模拟指定查询山东大学的
SELECT * FROM question_practice_detail q INNER JOIN user_profile u ON u.device_id = q.device_id LEFT JOIN question_detail d ON q.question_id = d.question_id WHERE u.university = '山东大学'
结果如下:
题目要求 “不同学校、不同难度的用户平均答题数”。
从上图可以看到,如果想求山大的不同难度平均答题数,先要求出“参与答题的用户数量”,即:
count(distinct q.device_id) 因为id可能重复 所以要去重。
再求出各个难度的答题总数,相除即可,各难度分别的答题总数:
count(q.question_id) 同时通过 group by 对"难度"分组: GROUP BY u.university,d.difficult_level 这样就实现了 查询到不同难度分组下的答题数
最后合并起来:
-- 不同学校、不同难度的用户平均答题量 SELECT u.university, d.difficult_level, round(count(q.question_id) / count(distinct q.device_id), 4) as avg_answer_cnt FROM question_practice_detail q INNER JOIN user_profile u ON u.device_id = q.device_id LEFT JOIN question_detail d ON q.question_id = d.question_id GROUP BY u.university,d.difficult_level;
我的思考:看到要分组,“不同学校 不同难度”,就想到了GROUP BY ,其实可以先指定其中 具体的 一个分组 写出这个分组怎么查出结果,可以把GROUP BY里的分组条件 转换成WHERE语句的判断条件。比如指定一个分组山东大学 简单难度 ,WHERE university='山东大学' and difficult_level='easy';,从局部到整体。