首页 > 试题广场 >

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

[编程题]统计每个学校的答过题的用户的平均答题数
  • 热度指数:604062 时间限制: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,avg(count_di) avg_answer_cnt
from
(select a.device_id,
u.university,a.count_di
from (select device_id,
count(*) as count_di
from question_practice_detail
group by device_id)  a
inner join user_profile u on u.device_id= a.device_id) b
group by university
order by avg_answer_cnt asc;
发表于 2025-06-17 16:06:17 回复(0)
select new.university, 
round(count(temp.question_id)/count(distinct temp.device_id),4) 
as avg_answer_cnt
from user_profile as new
right join question_practice_detail as temp 
on temp.device_id = new.device_id
group by university
order by university asc
完全当作一个表写
发表于 2025-06-09 20:19:53 回复(0)
select
u.university
,round(count(q.device_id)/count(distinct q.device_id),4) as avg_answer_cnt
from user_profile u,question_practice_detail q
where u.device_id=q.device_id
group by u.university
order by u.university

发表于 2025-06-08 16:45:55 回复(0)
select university,
count(question_id)/count(distinct(t2.device_id))
avg_answer_cnt
from question_practice_detail t2 inner join user_profile t1
on t1.device_id = t2.device_id
group by university;
问题在于平均数的计算,对用户去重,
我一开始还在想怎么仅对大学分组又能得到其他数据,后来我看了结果表才知道根本不要求其他字段
发表于 2025-05-13 15:07:15 回复(0)
select u.university,
round(count(q.question_id)/count(distinct q.question_id),4) as avg_answer_cnt
from user_profile u join question_practice_detail q on u.device_id=q.device_id
group by u.university
order by u.university
实在看不出来哪里有问题了 ,有无大神指导下
发表于 2025-05-13 11:31:19 回复(0)

select a.university, count(1)/count(distinct a.device_id) as avg_answer_cnt
from user_profile a,question_practice_detail b
where a.device_id=b.device_id
group by a.university 
order by a.university

发表于 2025-04-28 14:32:03 回复(0)
SELECT 
    university,
    ROUND(COUNT(*)/ COUNT(DISTINCT device_id), 4) AS avg_answer_cnt
FROM user_profile
JOIN question_practice_detail USING (device_id)
GROUP BY university
ORDER BY university

发表于 2025-04-10 13:35:58 回复(0)
我写的错误的代码如下

1
2
3
4
5
6
7
8
select 
university,
round(count(question_id)%count(device_id),4) as avg_answer_cnt
from user_profile u
left join question_practice_detail q
on u.device_id=q.device_id
group by university
order by university;

原因:除号,应该用/,而非%;应该用内连接;选错了表;未去重;无需排序。
发表于 2025-04-04 14:27:21 回复(2)
select university,
count(question_id) / count(distinct b.device_id) as avg_answer_cnt
from question_practice_detail as b
join user_profile as a
on b.device_id=a.device_id
group by university
order by university
发表于 2025-04-03 11:13:05 回复(0)
select
    university,
    round(
        (count(question_id) / count(distinct b.device_id)),
        4
    ) as avg_answer_cnt
from
    user_profile a
    join question_practice_detail b on a.device_id = b.device_id
group by
    university
order by
    university
发表于 2025-03-27 19:14:00 回复(0)

SELECT 
    university,
    round(count(question_id)/count(distinct(q.device_id)),4) as avg_answer_cnt
FROM user_profile as u,question_practice_detail as q
WHERE q.device_id = u.device_id
GROUP BY university
ORDER BY university asc;

SELECT
    university,
    round(count(question_id)/count(distinct(q.device_id)),4) as avg_answer_cnt
FROM user_profile as u
JOIN question_practice_detail as q on u.device_id = q.device_id
GROUP BY university
ORDER BY university;

发表于 2025-03-27 10:28:25 回复(0)
select
    university,
    round(
        (count(question_id) / count(up.device_id)),
        4
    ) as avg_answer_cnt
from
    question_practice_detail as qp
    inner join user_profile as up on qp.device_id = up.device_id
group by
    university;
问下这里我用的第二个count中用的user_profile表的device_id 为什么不行,这表没有重复的device_id,为什么要加上distinct才能通过?
发表于 2025-03-21 18:38:43 回复(0)
重点在于avg_answer_cnt,需要通过计算获取。count(question_id)/count(distinct B.device_id)
user_profile作为左表 A,question_practice_detail作为右表B。右边表中的数据更多,需要根据右表数据显示结果,即需要使用右关联。
select A.university, 
count(question_id)/count(distinct B.device_id) as avg_answer_cnt
from user_profile A
right join
question_practice_detail B
on 
A.device_id=B.device_id
group by
A.university
order by
A.university;



发表于 2025-03-20 15:52:12 回复(0)
select university,round(count(question_id) /count(distinct u.device_id),4) as avg_answer_cnt
from question_practice_detail as q, user_profile as u
where q.device_id = u.device_id
group by university
order by university;
此题重要的理解是对于人次和人数的理解,人次是加总,人数是用distinct去重后的加总。
发表于 2025-03-18 21:52:09 回复(0)
select up.university,round(count(question_id)/count(distinct qp.device_id),4) as	avg_answer_cnt from  question_practice_detail as qp
inner join  user_profile as up
on qp.device_id=up.device_id
group by university
order by university asc
总回答次数/ distinct 设备数量=人均回答次数

发表于 2025-03-13 17:49:40 回复(0)
一开始把公式写成了count(q.device_id)/count(u.device_id)asavg_answer_cnt是因为理解错了题目内容,只要求回答过人,所以不能把所有id都count因为还有没有回答过的device_id

select u.university,count(q.device_id)/count(distinct q.device_id) as avg_answer_cnt
from user_profile u
join question_practice_detail q using(device_id)
group by u.university

发表于 2025-03-10 14:53:32 回复(0)
SELECT
university,
COUNT(question_id) / COUNT(DISTINCT up.device_id) AS avg_answer_cnt
FROM
user_profile up
JOIN
question_practice_detail qpd
USING(device_id)
GROUP BY
university
ORDER BY
university
发表于 2025-03-06 12:21:14 回复(0)
没看懂但这段代码莫名其妙通过了
select 
    university, 
    avg(answer_cnt) as avg_answer_cnt
from user_profile
join (
    select 
        device_id,
        count(question_id) as answer_cnt
    from question_practice_detail
    group by device_id
) sub_query
on user_profile.device_id = sub_query.device_id
group by university
order by university;


发表于 2025-02-26 16:55:11 回复(0)