题解 | #统计每个学校各难度的用户平均刷题数#
统计每个学校各难度的用户平均刷题数
https://www.nowcoder.com/practice/5400df085a034f88b2e17941ab338ee8
题目答案:
select u.university, q2.difficult_level, count(q1.device_id)/count(distinct(q1.device_id)) as avg_answer_cnt from user_profile u inner join question_practice_detail q1 on u.device_id=q1.device_id inner join question_detail q2 on q1.question_id=q2.question_id group by u.university, q2.difficult_level
1.疑惑人的点可能就在平均刷题数了,答题的总数/答题的总人数,
在表question_practice_detail中,每个device_id对应一个人,device_id可能重复出现因为有的人会答了好几题,device_id的总数就是答题总数,不同的device_id就对应答题人数,分别为:
count(q1.device_id)
count(distinct(q1.device_id))
所以平均刷题数为
count(q1.device_id)/count(distinct(q1.device_id))2.不使用left join,比如复旦大学的device_id为4321的用户没有答题,如果用left join会返回一行 “复旦大学 None None”,
可以使用right join,因为表question_detail中的question_id在表question_practice_detail中都出现过,表question_practice_detail中的device_id在表user_profile中都出现过,
但是这类型的题目建议使用inner join,因为当表很大时,很难看清楚各表各列是否都出现过,使用inner join返回三个表都匹配的内容。
