596. 超过5名学生的课
下面是我写的版本
这个版本的思路是一步步修改得到的
1 我按照课程进行分组并计数
2 运行出错发现如果记录出现重复项则结果有误,因此要进行去重。我去重的方式为删除原表中的重复记录select distinct * from courses
select class from (select class,count(class) as class_count from (select distinct * from courses) as f
group by class) as t
where t.class_count >=5
刚刚我又想到另一种写法
select class from (select distinct * from courses) as f
group by class
having count(class) >=5
类似count(class)
这种原表中不存在的变量,想要把它运用到判断中时,前面得是having,而不能是where。
此处要穿插having和where的使用情况区别
下面这段话摘自《深入解析sas——数据处理、分析优化与商业应用》p231:类似于WHERE语句,HAVING语句也是用来选择满足特定条件的行,二者之间不同之处在于:where从句的操作是在select从句前(这句话解释了为什么第二段程序要用having,因为count(class)是在select中才会出现的新变量),而HAVING从句的执行在SELECT与GROUP BY之后。因此,涉及GROUP BY时,只能用HAVING语句。
下面为网友的版本代码来源
select class
from courses
group by class
having count(distinct student) >= 5;
这种写法有个我之前没有用到的用法,就是count(distinct student)
,下面测试一下在count()函数里加distinct会有什么样的影响。
从这两张图的结果可以发现,加了distinct的意思是对去重后的学生,按照课程进行分组计数。也就是我们想要的结果。