题解 | #统计每个学校各难度的用户平均刷题数#
解题思路
解读信息点
题目:运营想要计算一些参加了答题的不同学校、不同难度的用户平均答题量,请你写SQL取出相应数据
- 1.解析该描述和这三张表,由于学校在user_profile,答题数量在question_detail,难度在question_detail,所以我们需要先进行三张表的关联,一开始的SQL我们可以先这么写
SELECT up.university, qd.difficult_level FROM user_profile up LEFT JOIN question_practice_detail qpd ON up.device_id = qpd.device_id LEFT JOIN question_detail qd ON qpd.question_id = qd.question_id
- 2.不同学校、不同难度:这个就需要我们对学校和难度进行分组,我们可以进一步完善SQL
-- GROUP BY up.university, qd.difficult_level SELECT up.university, qd.difficult_level FROM user_profile up LEFT JOIN question_practice_detail qpd ON up.device_id = qpd.device_id LEFT JOIN question_detail qd ON qpd.question_id = qd.question_id GROUP BY up.university, qd.difficult_level
- 3.平均刷题数(结果在小数点位数保留4位,4位之后四舍五入):我们可以使用答题记录除以机器数量(机器可能多个人使用,所以我们需要去重)就能够得到我们的平均刷题数目,即:
ROUND(COUNT(qpd.question_id) / COUNT(DISTINCT(up.device_id)), 4) avg_answer_cnt
- 4.所以我们最后完整的SQL语句如下
- 由于我们全程都是左连接的,可能会存在某些学校对某种难度的题目不参与答题的情况,所以我们需要对难度为空的记录进行去除
SELECT up.university, qd.difficult_level, ROUND(COUNT(qpd.question_id) / COUNT(DISTINCT(up.device_id)), 4) avg_answer_cnt FROM user_profile up LEFT JOIN question_practice_detail qpd ON up.device_id = qpd.device_id LEFT JOIN question_detail qd ON qpd.question_id = qd.question_id GROUP BY up.university, qd.difficult_level HAVING qd.difficult_level IS NOT NULL