MySQL计数+去重

这篇博客讨论了在MySQL中处理超过5名学生的课程问题。作者首先尝试按课程分组并计数,但发现重复记录导致错误,于是通过删除重复记录来解决。接着,作者指出在涉及GROUP BY时,需要使用HAVING而不是WHERE,因为HAVING是在SELECT和GROUP BY之后执行。文章引用了一段SAS书籍的内容来解释两者的区别。最后,作者分享了一种使用COUNT(DISTINCT class)的方法,展示了如何对去重后的学生进行分组计数,得到了期望的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的意思是对去重后的学生,按照课程进行分组计数。也就是我们想要的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值