首页 > 试题广场 >

分组过滤练习题

[编程题]分组过滤练习题
  • 热度指数:481306 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5的学校或平均回帖数小于20的学校。

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

根据示例,你的查询应返回以下结果,注意返回的字段名需要保持一致,同时保留3位小数(系统后台也会自动校正),3位之后四舍五入:
university avg_question_cnt avg_answer_cnt
北京大学 2.500 21.000
浙江大学 1.000 2.000

解释: 平均发贴数低于5的学校或平均回帖数小于20的学校有2个
属于北京大学的用户的平均发帖量为2.500,平均回答数量为21.000
属于浙江大学的用户的平均发帖量为1.000,平均回答数量为2.000
示例1

输入

drop table if exists user_profile;
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` float,
`answer_cnt` float
);
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);

输出

university|avg_question_cnt|avg_answer_cnt
北京大学|2.500|21.000
浙江大学|1.000|2.000
头像 webary
发表于 2021-09-03 17:13:19
精华题解 题意明确: 取出平均发贴数低于5的学校或平均回帖数小于20的学校 问题分解: 限定条件:平均发贴数低于5或平均回帖数小于20的学校,avg(question_cnt)<5 or avg(answer_cnt)<20,聚合函数结果作为筛选条件时,不能用where,而是用having语法 展开全文
头像 牛客648694214号
发表于 2022-03-10 18:57:18
一、SQL答案 select university, round(avg(question_cnt),3) AS avg_question_cnt, round(AVG(answer_cnt),3) as avg_answer_cnt FROM user_profile GROUP BY univ 展开全文
头像 DraonAbyss
发表于 2021-09-28 14:21:29
知识 使用HAVING HAVING子句用于对分组后的结果再进行过滤,它的功能有点像WHERE子句,但它用于组而不是单个记录。在HAVING子句中可以使用统计函数,但在WHERE子句中则不能。HAVING通常与GROUP BY子句一起使用。 例36.查询学生表中人数大于等于3的班号和人数。 SELE 展开全文
头像 www_lbl
发表于 2021-08-27 15:51:27
1.首先用到的是 avg()求平均值2.起一个别名3.做判断3.1用having 比较3.2用子查询在用where推荐使用2方式答题答题方式1select sp.university ,sp.avg_question,sp.avg_answer_contfrom(select university, 展开全文
头像 牛客461688170号
发表于 2021-10-21 17:30:43
having用于聚合函数的筛选, where中不能使用聚合函数 where子句在聚合前先筛选记录,也就是说作用在group by 子句和having子句前,而 having子句在聚合后对组记录进行筛选 select university,avg(question_cnt) as ave_ 展开全文
头像 Geneningz
发表于 2022-03-19 17:09:46
题意解读 仔细阅读题目,我们首先可以明确,最终呈现结果有三列,所以在select的部分肯定要包含这三部分(其中university列的存在意义是用于分组);其次,我们需要查看筛选条件,那就是两个新建的字段(avg_question_cnt avg_answer_cnt)的值限制范围,由此我们可以进 展开全文
头像 96nnnnie
发表于 2021-08-25 10:45:57
select university ,avg(question_cnt) as avg_question_cnt,avg(answer_cnt) as avg_answer_cntfrom user_profilegroup by universityhaving avg(question_cnt) 展开全文
头像 Yogurt酸奶
发表于 2022-04-21 13:32:00
题意解读 题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5的学校或平均回帖数小于20的学校 每个学校:即学校只出现一次,依据学校进行分组,group by university 平均发帖数<5:使用求平均值函数avg,avg(ques 展开全文
头像 A、半k代码走天下
发表于 2022-04-10 14:28:11
正确答案 select `university`,avg(`question_cnt`) as 'avg_question_cnt', avg(`answer_cnt`) as 'avg_answer_cnt' from `user_profile` group by `university 展开全文
头像 WT冲啊
发表于 2021-10-27 09:15:35
SELECT university, avg(question_cnt) as avg_question_cnt, avg(answer_cnt) as avg_answer_cnt FROM user_profile group by university HAVING avg(qu 展开全文
头像 人生苦短,但求成长
发表于 2022-03-11 22:21:38
select university, round(avg(question_cnt),3) as avg_question_cnt, round(avg(answer_cnt),3) as avg_answer_cnt from user_profile group 展开全文