首页 > 试题广场 >

统计每个学校的答过题的用户的平均答题数

[编程题]统计每个学校的答过题的用户的平均答题数
  • 热度指数:687121 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
运营想要了解每个学校答过题的用户平均答题数量情况,请你取出数据。

用户信息表 user_profile,其中device_id指终端编号(认为每个用户有唯一的一个终端),gender指性别,age指年龄,university指用户所在的学校,gpa是该用户平均学分绩点,active_days_within_30是30天内的活跃天数。
device_id gender
age
university gpa active_days_within_30
2138 male 21 北京大学 3.4 7
3214
male NULL 复旦大学 4 15
6543 female 20 北京大学 3.2 12
2315 female 23 浙江大学 3.6 5
5432 male 25 山东大学 3.8 20
2131 male 28 山东大学 3.3 15
4321 male
28 复旦大学 3.6 9
第一行表示:用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天
最后一行表示:用户的常用信息为使用的设备id为4321,性别为男,年龄28岁,复旦大学,gpa为3.6,在过去的30天里面活跃了9天
答题情况明细表 question_practice_detail,其中question_id是题目编号,result是答题结果。
device_id question_id result
2138 111 wrong
3214 112 wrong
3214 113
wrong
6543 111 right
2315 115 right
2315 116 right
2315 117 wrong
5432 118 wrong
5432 112 wrong
2131 114 right
5432 113 wrong

第一行表示用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误
....
最后一行表示用户的常用信息为使用的设备id为5432,在question_id为113的题目上,回答错误

请你写SQL查找每个学校用户的平均答题数目(说明:某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数)根据示例,你的查询应返回以下结果(结果保留4位小数),注意:结果按照university升序排序!!!

university avg_answer_cnt
北京大学 1.0000
复旦大学 2.0000
山东大学 2.0000
浙江大学 3.0000

解释:
第一行:北京大学总共有2个用户,2138和6543,2个用户在question_practice_detail里面答了2题,平均答题数目为2/2=1.0000
....
最后一行:浙江大学总共有1个用户,2315,这个用户在question_practice_detail里面答了3题,平均答题数目为3/1=3.0000
示例1

输入

drop table if exists `user_profile`;
drop table if  exists `question_practice_detail`;
CREATE TABLE `user_profile` (
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int
);
CREATE TABLE `question_practice_detail` (
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL
);

INSERT INTO user_profile VALUES(2138,'male',21,'北京大学',3.4,7);
INSERT INTO user_profile VALUES(3214,'male',null,'复旦大学',4.0,15);
INSERT INTO user_profile VALUES(6543,'female',20,'北京大学',3.2,12);
INSERT INTO user_profile VALUES(2315,'female',23,'浙江大学',3.6,5);
INSERT INTO user_profile VALUES(5432,'male',25,'山东大学',3.8,20);
INSERT INTO user_profile VALUES(2131,'male',28,'山东大学',3.3,15);
INSERT INTO user_profile VALUES(4321,'male',28,'复旦大学',3.6,9);
INSERT INTO question_practice_detail VALUES(2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(6543,111,'right');
INSERT INTO question_practice_detail VALUES(2315,115,'right');
INSERT INTO question_practice_detail VALUES(2315,116,'right');
INSERT INTO question_practice_detail VALUES(2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(5432,118,'wrong');
INSERT INTO question_practice_detail VALUES(5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(2131,114,'right');
INSERT INTO question_practice_detail VALUES(5432,113,'wrong');

输出

university|avg_answer_cnt
北京大学|1.0000
复旦大学|2.0000
山东大学|2.0000
浙江大学|3.0000
select university,
       round(sum(person_answer)/count(user_profile.device_id),4) as avg_answer_cnt
       #round精确小数点,sum统计总答题个数,count统计总体人数
       #思维链>>>>>1、每个大学答题的平均水平>>>>>>2、每个大学的人数,以及他们总的
       #答题次数,两者的商则是上一步>>>>>>3、一个学生的答题次数
       #至此,逻辑已通,将思路转化为代码则是,3、统计答题表中,每个id的答题次数,用分组和计数函数
       #>>>>2、将上一步中的表与用户表进行连接,其逻辑是,一个设备号只对应了一名学生。
       #>>>>1、用户表中的id是唯一的,按照大学分组,进行统计可以知道每个大学的人数
FROM (select device_id,count(result) as person_answer from question_practice_detail  
      group by device_id)as a
      #按照设备id分组(便是按照学生分组),一个学生可以答不同的题目,用count把多行整合成一行
JOIN user_profile ON a.device_id=user_profile.device_id
group by university
order by university
#题目扩展思考:1、一个学生可能会有多个设备号,2、一个学生在同一个题目下面会回答至少一次,直至回答正确
欢迎大家进行优化!

发表于 2025-12-19 17:42:19 回复(0)
#答题数量是count(对+错)或count(回答的题目数),找平均答题数关键是做除法,连接键还是device——id, 关键看怎么写答题数量的聚合函数,注意答题人数需要去重
select u.university,
round(count(q.result)/ count(distinct q.device_id),4) as avg_answer_cnt
from user_profile u
inner join question_practice_detail q
on q.device_id = u.device_id
group by u.university
发表于 2025-11-06 00:57:49 回复(0)
真难这题,特别是求
round(count(university)/count(DISTINCT question_practice_detail.device_id),4)
发表于 2025-11-03 09:42:43 回复(0)
select
    u.university,
    round(
        count(q.question_id) / count(distinct q.device_id),
        4
    ) as avg_answer_cnt
from
    question_practice_detail as q
join
    user_profile as u
on q.device_id = u.device_id
group by u.university
order by
    u.university asc

发表于 2025-11-02 16:15:06 回复(0)
select u.university,
   round(count(qpd.question_id) / count(distinct u.device_id),4) as avg_answer_cnt----注意不取空值(inner join)后还是要去重
from user_profile u
inner join  question_practice_detail qpd
       on u.device_id = qpd.device_id
group by u.university
发表于 2025-10-30 09:49:18 回复(0)
-- 答过题的用户
-- 平均答题数量
-- 结果按照university升序排序
-- 结果保留4位小数
-- 关联:inner join 因为只要答过题的用户
-- 学校用户答题总次数 / 答过题的不同用户个数

select u.university as university
    , round(count(1) / (count(distinct u.device_id)), 4) as avg_answer_cnt
from
    user_profile as u
    inner join
        question_practice_detail as q
        on q.device_id = u.device_id
group by
    u.university
order by
    university asc
;
发表于 2025-10-28 17:58:56 回复(0)
SELECT u.university,ROUND(count(*)/count(DISTINCT u.device_id),4) as avg_answer_cnt FROM user_profile u, question_practice_detail q 
WHERE u.device_id = q.device_id
GROUP BY university
ORDER BY university;

发表于 2025-10-20 19:49:35 回复(0)
好晕
select university, round(avg(temp.question_id_count), 4) as avg_answer_cnt
from
    (
        select up.device_id, university, count(question_id) as question_id_count
        from user_profile up, question_practice_detail qpd
        where up.device_id = qpd.device_id
        group by up.device_id, university
    ) temp
group by university
order by university
发表于 2025-10-14 17:05:41 回复(0)
select  university,count(question_id)/count(distinct b.device_id) avg_answer_cnt
from user_profile a left join question_practice_detail b on a.device_id = b.device_id
group by university;
为什么我提交的结果表里有一个北京理工大呢
发表于 2025-10-11 22:57:45 回复(0)
SELECT
    u.university,
    ROUND(AVG(t.answer_cnt), 4) AS avg_answer_cnt
FROM
    (
        -- 第一步:按用户统计答题次数(只含答过题的用户)
        SELECT
            device_id,
            COUNT(*) AS answer_cnt
        FROM
            question_practice_detail
        GROUP BY
            device_id
    ) t
    JOIN user_profile u ON t.device_id = u.device_id
    -- 第二步:按学校汇总并取平均(AVG 会计算 t.answer_cnt 的平均)
GROUP BY
    u.university
ORDER BY
    u.university;

发表于 2025-10-04 20:57:07 回复(0)
SELECT university,ROUND(COUNT(qpd.question_id)/COUNT(DISTINCT qpd.device_id),4) AS avg_answer_cnt
FROM user_profile up
LEFT JOIN question_practice_detail qpd
ON up.device_id=qpd.device_id
GROUP BY up.university
ORDER BY up.university;
大佬们,我想请教一下,为什么我的运行结果里会出现表格中不存在的属性啊?应该怎么解决呢
发表于 2025-09-16 18:51:38 回复(0)
SELECT university,
    COUNT(question_id)/COUNT(DISTINCT question_practice_detail.device_id)  AS avg_answer_cnt
FROM     user_profile
INNER JOIN question_practice_detail ON user_profile.device_id = question_practice_detail.device_id
GROUP BY university;
不能直接使用AVG(COUNT()),因为人数需要单独计算。
发表于 2025-09-12 17:16:09 回复(0)
select
    u.university,
   count(q.question_id) / count( distinct q.device_id) avg_answer_cnt
from
    question_practice_detail q
    left join user_profile u on q.device_id = u.device_id
group by
u.university
order by
u.university asc;
发表于 2025-09-04 19:03:51 回复(0)
select university,round(count(q.device_id)/count(distinct q.device_id),4) avg_answer_cnt 
from user_profile u 
join question_practice_detail q on u.device_id=q.device_id
group by university
order by university
此题的两个点需注意:
第一点是用回答数/回答人数,回答人数需去重;
第二点表连接时需用join,这样可以把没有回答的学校去除掉
发表于 2025-08-08 10:29:38 回复(2)
各位大佬好,我这么写为什么不对呀?

select u.university, (count(q.question_id)/count(distinct q.device_id))as avg_answer_cnt
from user_profile as u
inner join  question_practice_detail as q on
u.device_id=q.device_id
group by u.university
order by avg_answer_cnt ASC


发表于 2025-08-06 17:18:42 回复(0)
基于university分组统计问题数量和人数,相除即可。

select
    u.university,
    round(count(q.question_id) / count(distinct q.device_id),4) as avg_answer_cnt
from
    question_practice_detail q
    left join user_profile u on q.device_id = u.device_id
group by
    u.university


发表于 2025-08-06 14:44:56 回复(0)
左连接:
select
    up.university,
    (count(qpd.question_id)/count(distinct(up.device_id))) as  avg_answer_cnt
from user_profile up
right join question_practice_detail qpd
    on up.device_id = qpd.device_id
group by university
order by university




内连接:
select 
    up.university,
    (count(qpd.question_id)/count(distinct(up.device_id))) as  avg_answer_cnt 
from user_profile up
left join question_practice_detail qpd
    on up.device_id = qpd.device_id
group by university
order by university;

发表于 2025-08-02 11:52:31 回复(1)