首页 > 试题广场 >

统计每个学校各难度的用户平均刷题数

[编程题]统计每个学校各难度的用户平均刷题数
  • 热度指数:548716 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
题目:运营想要计算一些参加了答题不同学校、不同难度的用户平均答题量,请你写SQL取出相应数据
用户信息表:user_profile
id device_id gender age university gpa active_days_within_30 question_cnt answer_cnt
1 2138 male 21 北京大学 3.4 7 2 12
2 3214 male
复旦大学 4 15 5 25
3 6543 female 20 北京大学 3.2 12 3 30
4 2315 female 23 浙江大学 3.6 5 1 2
5 5432 male 25 山东大学 3.8 20 15 70
6 2131 male 28 山东大学 3.3 15 7 13
7 4321 male 28 复旦大学 3.6 9 6 52

第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天,发帖数量为2,回答数量为12
最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄28岁,复旦大学,gpa为3.6,在过去的30天里面活跃了9天,发帖数量为6,回答数量为52

题库练习明细表:question_practice_detail
id device_id question_id result
1 2138 111 wrong
2 3214 112 wrong
3 3214 113 wrong
4 6543 111 right
5 2315 115 right
6 2315 116 right
7 2315 117 wrong
8 5432 117 wrong
9 5432 112 wrong
10 2131 113 right
11 5432 113 wrong
12 2315 115 right
13 2315 116 right
14 2315 117 wrong
15 5432 117 wrong
16 5432 112 wrong
17 2131 113 right
18 5432 113 wrong
19 2315 117 wrong
20 5432 117 wrong
21 5432 112 wrong
22 2131 113 right
23 5432 113 wrong

第一行表示:id为1的用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误
......
最后一行表示:id为23的用户的常用信息为使用的设备id为5432,在question_id为113的题目上,回答错误
表:question_detail
id question_id difficult_level
1 111 hard
2 112 medium
3 113 easy
4 115 easy
5 116 medium
6 117 easy

第一行表示: 题目id为111的难度为hard
....
最后行表示: 题目id为117的难度为easy

请你写一个SQL查询,计算不同学校、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):
university difficult_level avg_answer_cnt
北京大学 hard 1.0000
复旦大学 easy 1.0000
复旦大学 medium 1.0000
山东大学 easy 4.5000
山东大学 medium 3.0000
浙江大学 easy 5.0000
浙江大学 medium 2.0000
解释:
第一行:北京大学有设备id为2138,6543这2个用户,这2个用户在question_practice_detail表下都只有一条答题记录,且答题题目是111,从question_detail可以知道这个题目是hard,故 北京大学的用户答题为hard的题目平均答题为2/2=1.0000

第二行,第三行:复旦大学有设备id为3214,4321这2个用户,但是在question_practice_detail表只有1个用户(device_id=3214有答题,device_id=4321没有答题,不计入后续计算)有2条答题记录,且答题题目是112,113各1个,从question_detail可以知道题目难度分别是medium和easy,故 复旦大学的用户答题为easy, medium的题目平均答题量都为1(easy=1或medium=1) /1 (device_id=3214)=1.0000

第四行,第五行:山东大学有设备id为5432和2131这2个用户,这2个用户总共在question_practice_detail表下有12条答题记录,且答题题目是112,113,117,且数目分别为3,6,3,从question_detail可以知道题目难度分别为medium,easy,easy,所以,easy共有9个,故easy的题目平均答题量= 9(easy=9)/2 (device_id=3214 or device_id=5432) =4.5000,medium共有3个,medium的答题只有device_id=5432的用户,故medium的题目平均答题量= 3(medium=3)/1 ( device_id=5432) =3.0000
.....

示例1

输入

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

INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(8,5432,117,'wrong');
INSERT INTO question_practice_detail VALUES(9,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(10,2131,113,'right');
INSERT INTO question_practice_detail VALUES(11,5432,113,'wrong');
INSERT INTO question_practice_detail VALUES(12,2315,115,'right');
INSERT INTO question_practice_detail VALUES(13,2315,116,'right');
INSERT INTO question_practice_detail VALUES(14,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(15,5432,117,'wrong');
INSERT INTO question_practice_detail VALUES(16,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(17,2131,113,'right');
INSERT INTO question_practice_detail VALUES(18,5432,113,'wrong');
INSERT INTO question_practice_detail VALUES(19,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(20,5432,117,'wrong');
INSERT INTO question_practice_detail VALUES(21,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(22,2131,113,'right');
INSERT INTO question_practice_detail VALUES(23,5432,113,'wrong');
INSERT INTO question_detail VALUES(1,111,'hard');
INSERT INTO question_detail VALUES(2,112,'medium');
INSERT INTO question_detail VALUES(3,113,'easy');
INSERT INTO question_detail VALUES(4,115,'easy');
INSERT INTO question_detail VALUES(5,116,'medium');
INSERT INTO question_detail VALUES(6,117,'easy');

输出

北京大学|hard|1.0000
复旦大学|easy|1.0000
复旦大学|medium|1.0000
山东大学|easy|4.5000
山东大学|medium|3.0000
浙江大学|easy|5.0000
浙江大学|medium|2.0000
头像 牛客题解官
发表于 2025-02-14 10:22:32
精华题解 这道题目要求我们计算不同学校、不同难度的用户平均答题量。我们需要从三个表中提取数据:user_profile、question_practice_detail 和 question_detail。 解题步骤: 连接表:我们需要将 user_profile 表与 question_practice 展开全文
头像 webary
发表于 2021-09-03 17:54:33
题意明确: 计算每个学校用户不同难度下的用户平均答题题目数 问题分解: 限定条件:无; 每个学校:按学校分组group by university 不同难度:按难度分组group by difficult_level 平均答题数:总答题数除以总人数count(qpd.question_id) / 展开全文
头像 玉树叶
发表于 2021-11-11 16:21:09
没啥说的跟上一道题差不多我看的视频还没到join所以直接where筛选就完事了 SELECT university, difficult_level, COUNT(q_p.question_id) / COUNT(DISTINCT q_p.device_id) avg_an 展开全文
头像 金木犀20190306135695
发表于 2021-09-08 17:31:48
每个学校用户不同难度下的用户平均答题题目数1、分析题目:①每个学校、不同难度:以学校名称和难度分类order by u.university and qd.difficult_level②平均答题数目=总答题数目/答题人数coun(q.result)/count(distinct(q.device_ 展开全文
头像 奋斗终身_伟大复兴
发表于 2021-09-23 21:18:30
# 其实三表联查,在互联网项目中,是不合适的,因为其性能很差,追求性能,可以通过前期的表设计或者其他代码逻辑维护表的数据 # 我们通过观察发现,这道题,跟前面一道,加入了另一张表的查询。question_practice_detail这个表拥有其他两个表相同的数据 # 通过关系连接表与表中间关系字段 展开全文
头像 Geneningz
发表于 2022-03-19 19:22:01
典型的三段式SQL写法 # 第一段:select选择字段,含原生字段及构造字段,其中构造的过程中常用sum count round +-*/ 等函数及运算表达式 select university, difficult_level, round(count(qpd.quest 展开全文
头像 SuccessLIU
发表于 2023-03-03 20:54:28
select university,difficult_level, count(question_practice_detail.question_id)/count(distinct user_profile.device_id) as avg_answer_cnt f 展开全文
头像 Stephenchow_
发表于 2023-02-06 14:25:09
select university, difficult_level, count(qp.question_id)/count(distinct qp.device_id) avg_answer_cnt from question_practice_detail qp 展开全文
头像 DraonAbyss
发表于 2021-09-28 21:30:24
解题 所需信息分布三表,因此需要三表连接分组按照学校,难度依次即可平均计算仍需考虑同设备不同次登录问题,需要DISTICT加以区分除数,而被除数无需DISTINCT加以区分 题解 题目:运营想要计算每个学校用户不同难度下的用户平均答题题目数情况,请你取出相应数据 SELECT university, 展开全文
头像 Hjwwwww_
发表于 2023-01-06 14:30:58
方法①SELECT    university,    difficult_level,    COUNT(q_p.question_id) / COUNT(DISTINCT q_ 展开全文
头像 DQ_restart
发表于 2022-02-16 22:10:33
SELECT up.university, df.difficult_level, ROUND(COUNT(*) / COUNT(DISTINCT dq.device_id),4) "avg_answer_id" FROM&nbs 展开全文