题解 | #统计每个学校各难度的用户平均刷题数#
统计每个学校各难度的用户平均刷题数
https://www.nowcoder.com/practice/5400df085a034f88b2e17941ab338ee8?tpId=199&tqId=1975675&ru=/activity/oj&qru=/ta/sql-quick-study/question-ranking
SQL22 统计每个学校各难度的用户平均刷题数
查询条件: 无。
查询范围: 涉及三张表user_profile(up)、question_practice_detail(qpd)、question_detail(qd)。使用表连接,up和qpd使用device_id连接,qd和qpd使用question_id连接。由于是统计各个学校各难度的用户平均刷题数,故up表和qpd使用inner join就可,而可能某些question_id在qd表中没有记录,故使用left join。
查询结果: 学校:up.university。问题难度:qd.difficult_level。用户平均刷题数:使用count(qpd.question_id)/count(distinct up.device_id)计算,由于每个设备可以答多道题目,故计算用户人数的使用要去重。
每个学校各难度: 使用group by up.university,qd.difficult_level
select up.university,qd.difficult_level,count(qpd.question_id)/count(distinct qpd.device_id)
from question_practice_detail as qpd
inner join user_profile as up
on up.device_id = qpd.device_id
left join question_detail as qd
on qpd.question_id = qd.question_id
group by up.university,qd.difficult_level
之前自己一直没有太搞懂题目中count计算和group by的先后关系。原来是先将连接好的三张表的数据先按照up.university分组,再按照qd.difficult_level分组,分组好了(类似于下面的结构)再进行计算。
北京大学 | hard | 其他字段 |
---|---|---|
medium | 其他字段 | |
easy | 其他字段 |