首页 > 试题广场 >

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

[编程题]统计每个学校的答过题的用户的平均答题数
  • 热度指数:686609 时间限制: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
头像 webary
发表于 2021-09-03 17:45:02
精华题解 题意明确: 每个学校的用户平均答题数量 问题分解: 限定条件:无; 每个学校:按学校分组,group by university 平均答题数量:在每个学校的分组内,用总答题数量除以总人数即可得到平均答题数量count(question_id) / count(distinct device_id 展开全文
头像 牛客题解官
发表于 2025-02-13 17:52:53
精华题解 题目分析 表结构: user_profile 表包含用户的基本信息,包括 device_id 和 university。 question_practice_detail 表包含用户的题目回答记录,包括 device_id 和 question_id。 目标: 计算每个学校的用户平均答 展开全文
头像 牛客182179768号
发表于 2021-09-23 11:06:08
思路:第一,每个学校,涉及到利用GROUP BY分组实现;第二,用户平均答题数=所有用户答题总数/所有用户数,分母所有用户涉及到COUNT(DISTINCT ...)对登录设备账号进行剔重【由于存在一个设备账号多次登录的情况】,分子所有用户答题总数涉及COUNT()对question_id进行计数, 展开全文
头像 Geneningz
发表于 2022-03-19 18:36:48
三段式SQL编写 select段:首先明确要什么——university/avg_anser_cnt,其中第一个字段来自表1,第二个字段来自表2,且是表2中question_id与answer_id计算得到的结果 from段:来自表1通过inner join方式混合表2,联接的字段是device_ 展开全文
头像 摇裤儿满天飞
发表于 2021-10-13 10:52:23
右连接 题目中显示,“看到答过题目”的用户,就需要联想到右连接,然后看到用户的平均答题数就需要联想到分组 distinct去除重复答题的用户 COUNT(DISTINCT(q.device_id))就是取出答过题目的去除重复的用户数量 COUNT(q.question_id)就是答过题目的总用户总数 展开全文
头像 专研不劳而获二十载
发表于 2021-08-26 16:00:38
首先,题目得图片不对,要看下面得具体代码 其次,device_id可视为学生学号,然后分组后</count(q.question_id)>是每个组得答题数量,</count(distinct(q.device_id))>是每个组答题得学生数量,distinct 是去掉重 展开全文
头像 小柒爱做题
发表于 2021-10-20 18:07:51
由于要求要保留以为小数,所以需要加上ROUNT,提交才算正确,我看了好多都没有添加ROUNT,不知道你们提交时,有没有提示错误。 SELECT u.university, ROUND (COUNT(q.question_id) / count(distinct(u.device_id)),1) as 展开全文
头像 敖好好加油
发表于 2021-12-01 17:07:51
通过question_practice_detail表左连接user_profile表 通过university分组 聚合函数count计算出:各学校的答题总数count(device_id)/各学校的不同学生总数count(distinct device_id) 下面是完整的SQL: selec 展开全文
头像 仁狮001
发表于 2022-03-16 20:12:32
解题思路: 1、先统计每个用户的答题数量——count、子查询; 2、用答题用户表左连接学校信息,这样可以把未答过题的用户去掉——left join; 3、按学校分组统计平均答题数量——avg、group by; 4、按学校名称顺序排列——order by。 代码: 展开全文
头像 DraonAbyss
发表于 2021-09-28 18:13:44
解题 本题需要注意user_profile的answer_cnt是干扰项,仅需要device_id和university的信息。因为存在同设备的多条信息,所以平均的结果是question_practice_detail中同university的device_id数量与device_id类型的商。 题 展开全文
头像 牛客470284793号
发表于 2021-10-26 11:20:01
写了两种方法,我想知道在实际工作中那种效率更高?求大牛讲解一下,谢谢啦!! #方法一: SELECT university ,ROUND(COUNT(q.result)/COUNT(DISTINCT q.device_id),4) avg_answer_cnt FROM us 展开全文
头像 国士无双吾辈自强
发表于 2022-06-22 20:55:17
1.目标:查询每个学校答过题的用户平均答题数量情况 2.每个学校--->按学校分组 group by t1.university 3.平均答题数量、学校在两个表中--->两表连接,这里就是简单的内连接 user_profile t1 join question_practice_deta 展开全文