select up.university, qd.difficult_level, round(count(qpd.id)/count(distinct up.device_id), 4) as avg_answer_cnt from user_profile up join question_practice_detail qpd on up.device_id = qpd.device_id join question_detail qd on qpd.question_id = qd.question_id where up.university = '山东大学' group by up.university,qd.difficult_level order by qd.difficult_level;
select
up.university,
qd.difficult_level,
round(count(qpd.id)/count(distinct up.device_id), 4) as
avg_answer_cnt /
count(qpd.id)
:统计question_practice_detail
表中每个分组内的答题记录数量,即总的答题次数。count(distinct up.device_id)
:统计user_profile
表中每个分组内不同的设备 ID 数量,也就是参与答题的不同学生数量。count(qpd.id)/count(distinct up.device_id)
:将总的答题次数除以参与答题的不同学生数量,得到每个分组下学生的平均答题数量。round(..., 4)
:使用ROUND
函数将计算得到的平均答题数量结果保留 4 位小数。as avg_answer_cnt
:为计算结果指定一个别名avg_answer_cnt
,方便后续引用。
from
user_profile up
join
question_practice_detail qpd on
up.device_id = qpd.device_id/
join question_practice_detail qpd on up.device_id = qpd.device_id
:使用JOIN
操作将user_profile
表和question_practice_detail
表连接起来。连接条件是两个表中的device_id
相等,这样就可以将学生的基本信息(如学校)和他们的答题记录关联起来。同时为question_practice_detail
表指定别名qpd
。
join
question_detail qd on
qpd.question_id = qd.question_id/
join question_detail qd on qpd.question_id = qd.question
:再次使用JOIN
操作,将question_practice_detail
表和question_detail
表连接起来。连接条件是question_practice_detail
表的question_id
与question_detail
表的question
字段相等。这里可能存在问题,通常应该是qpd.question_id = qd.question_id
,因为一般两个表关联时会使用相同含义的字段进行连接。
where
up.university = '山东大学' /
该子句用于筛选出 user_profile
表中学校为山东大学的学生记录,只对这些学生的答题记录进行后续的统计和分析。
group by
up.university,qd.difficult_level /
该子句将连接后的结果按照 user_profile
表中的 university
字段和 question_detail
表中的 difficult_level
字段进行分组。
order by
qd.difficult_level; /
这里按照 question_detail
表中的 difficult_level
字段进行升序排序