题解 | #分组过滤练习题#

分组过滤练习题

http://www.nowcoder.com/practice/ddbcedcd9600403296038ee44a172f2d

题意明确:

取出平均发贴数低于5的学校或平均回帖数小于20的学校


问题分解:

  • 限定条件:平均发贴数低于5或平均回帖数小于20的学校,avg(question_cnt)<5 or avg(answer_cnt)<20,聚合函数结果作为筛选条件时,不能用where,而是用having语法,配合重命名即可;
  • 按学校输出:需要对每个学校统计其平均发贴数和平均回帖数,因此group by university

细节问题:

  • 表头重命名:as
  • 用having不用where

完整代码:

select
    university,
    avg(question_cnt) as avg_question_cnt,
    avg(answer_cnt) as avg_answer_cnt
from user_profile
group by university
having avg_question_cnt<5 or avg_answer_cnt<20
全部评论
正确的写法:select university, avg(question_cnt) as avg_question_cnt, avg(answer_cnt) as avg_answer_cnt from user_profile group by university having avg(question_cnt) < 5 or avg(answer_cnt) < 20; SQL的执行顺序,from、where、group by、having、select,在having中不应使用别名,因为别名的创建是在select中,而having在select之前执行,此时还没有别名
27 回复 分享
发布于 2022-12-31 13:01 北京
答案是想出来了, 但是觉得很矛盾, sql 运行顺序 having 是在 select 之前的, 那么 selcet 还没运行,having 这么可以用 聚合字段过滤呢? 求大佬解答
24 回复 分享
发布于 2021-12-04 15:40
聚合查询同样可以使用WHERE条件。这道题主要是考察的是对分组完的数据再进行筛选就需要用having了 SELECT group_by_column, AGG_FUNC(column_expression) AS aggregate_result_alias, … FROM mytable WHERE condition GROUP BY column HAVING group_condition;
11 回复 分享
发布于 2021-11-11 17:35
聚合函数结果作为筛选条件时,不能用where,而是用having语法
10 回复 分享
发布于 2022-07-13 09:42
having的执行顺序在select的前面,having不能直接使用select定义的别名,虽然MySQL不会发生执行错误,但这不是通用的使用方法
8 回复 分享
发布于 2023-10-24 20:20 福建
group by 为什么不能放最后面啊
5 回复 分享
发布于 2022-04-09 01:20
select university,cast(round(avg(question_cnt),3) as DECIMAL(10,3)) avg_question_cnt,cast(round(avg(answer_cnt),3) as DECIMAL(10,3)) avg_answer_cnt from user_profile group by university HAVING avg_question_cnt < 5 or avg_answer_cnt <20;
2 回复 分享
发布于 2022-06-04 20:02
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 university having avg_question_cnt<5 or avg_answer_cnt<20
2 回复 分享
发布于 2022-03-13 15:04
having ( or ) 要加括号吧!虽然不加结果是对的,但是与题目不一致。
1 回复 分享
发布于 2023-04-02 01:00 上海
mysql要求每一个派生出来的表都必须有一个自己的别名,那我给派生表加上别名即可; eg:修改后的sql,直接在新生产的表中加入 他的别命名就行(“as a”或者“a”),“a”为新表的别名
1 回复 分享
发布于 2022-12-19 02:16 四川
限定条件:平均发贴数低于5或平均回帖数小于20的学校,avg(question_cnt)<5 or avg(answer_cnt)<20,聚合函数结果作为筛选条件时,不能用where,而是用having语法,配合重命名即可; 按学校输出:需要对每个学校统计其平均发贴数和平均回帖数,因此group by university
1 回复 分享
发布于 2022-09-08 20:27 上海
为什么我这么写,会报语法错呢?可以帮忙看看问题吗 SELECT university, AVG(question_cnt) AS AVG_Q, AVG(answer_cnt) AS AVG_A FROM user_profile GROUP BY university HAVING AVG_Q<5 OR AVG_A<20 SQL_ERROR_INFO: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AVG(answer_cnt) AS AVG_A\nFROM user_profile\nGROUP BY university\nHAVING AVG_Q<5 OR' at line 3"
1 回复 分享
发布于 2022-08-28 15:59 广东
为什么平均值那不用保留小数后一位,加上round函数为什么报错?
1 回复 分享
发布于 2021-10-29 10:13
内存超了
点赞 回复 分享
发布于 2023-03-09 19:39 北京
求问,这里为什么不能使用子查询呀。代码: select university, avg_question_cnt, avg_answer_cnt from (select university, round(avg(question_cnt),3) as avg_question_cnt, round(avg(answer_cnt),3) as avg_answer_cnt from user_profile) where avg_question_cnt <5 or avg_answer_cnt <20
点赞 回复 分享
发布于 2022-10-26 00:13 北京

相关推荐

求面试求offer啊啊啊啊:把华北改为华南再试一试,应该就没啥问题了。改完可能都不用投,别人主动联系了。
点赞 评论 收藏
分享
评论
434
93
分享

创作者周榜

更多
牛客网
牛客企业服务