SELECT up.university, round(count(qpd.question_id)/count(distinct qpd.device_id),4) as avg_answer_cnt FROM user_profile up JOIN question_practice_detail qpd ON qpd.device_id = up.device_id group by up.university order by up.university;
SELECT
up.university,
round(count(qpd.question_id)/count(distinct qpd.device_id),4) as avg_answer_cnt/
COUNT(qpd.question_id)
:统计question_practice_detail
表中每个分组内的答题记录数量,也就是所有用户的总答题数。COUNT(DISTINCT qpd.device_id)
:统计question_practice_detail
表中每个分组内不同的设备 ID 数量,即答过题的用户数量。COUNT(qpd.question_id) / COUNT(DISTINCT qpd.device_id)
:将总答题数除以答过题的用户数量,得到每个学校答过题用户的平均答题数量。ROUND(..., 4)
:使用ROUND
函数将计算得到的平均答题数量结果保留 4 位小数。AS avg_answer_cnt
:为计算结果指定一个别名avg_answer_cnt
,方便后续引用。
FROM
user_profile up
JOIN
question_practice_detail qpd ON qpd.device_id = up.device_id/
用 JOIN
操作将 user_profile
表和 question_practice_detail
表连接起来。连接条件是两个表中的 device_id
相等,这样就可以将用户的基本信息(如学校)和他们的答题记录关联起来。同时为 question_practice_detail
表指定别名 qpd
。
group by
up.university/
该子句将连接后的结果按照 user_profile
表中的 university
字段进行分组。这样,SELECT
子句中的聚合函数(如 COUNT
)就会对每个不同的学校分组分别进行计算,得到每个学校的相关统计信息。
order by
up.university;/
ORDER BY
子句用于对最终的查询结果进行排序。这里按照 user_profile
表中的 university
字段进行升序排序