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 GROUP BY up.university, qd.difficult_level ORDER BY up.university, 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 u.device_id)
:统计user_profile
表中每个分组内不同的设备 ID 数量,也就是参与答题的不同用户数量。COUNT(qpd.id) / COUNT(DISTINCT u.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_detail qd ON qpd.question_id = qd.question_id
GROUP BY
up.university, qd.difficult_level/
该子句将连接后的结果按照 user_profile
表中的 university
字段和 question_detail
表中的 difficult_level
字段进行分组。
ORDER BY
up.university, qd.difficult_level;/
ORDER BY
子句用于对最终的查询结果进行排序。这里按照 user_profile
表中的 university
字段和 question_detail
表中的 difficult_level
字段进行升序排序