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