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 字段进行升序排序