Fork me on GitHub

leetcode-for-sql-超过5名学生的课程

LeetCode-596-超过5名学生的课程

今天带来的是LeetCode for SQL的第三题,主要考察的是group by分组统计和数据去重distinct的用法。

题目

有一个 courses 表 ,有 student (学生) 和 class (课程)。请列出所有超过或等于5名学生的课。例如,表:

1
2
3
4
5
6
7
8
9
10
11
12
13
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+

最终的结果输出为:

1
2
3
4
5
+---------+
| class |
+---------+
| Math |
+---------+

在最下面有个提示:学生在每个课中不应被重复计算。

⚠️这个提示很关键。在给出的数据中是没有学生和课程同时重复的,实际题目中有个坑,看过评论才知道:A同学重修了Math课程

思路

思路1

1、如果只看给出的数据,大部分人估计会写出的脚本如下:

1
2
3
4
5
select
class
from courses
group by class
having count(student) >= 5;

上面的脚本会报错就是没有考虑重修课程的A同学

2、正确的过程是先考虑学生和课程同时分组,取出重修的可能性,这样Math课程便只会出现6次

1
2
3
select
class
from courses group by class,student

然后在上面临时结果中根据class进行个数统计和having过滤即可,最终脚本为:

1
2
3
4
5
6
select class
from(select
class
from courses group by class,student) a -- 先根据课程和学生同时分组
group by class
having count(class) >= 5;

思路2

使用having进行分组后的过滤,同时需要会学生去重,这种是个人思路。也是在犯了常规错误之后想到的

1
2
3
4
5
select
class
from courses
group by class
having count(distinct student) >=5; -- distinct去重关键

思路3

思路3和思路1是比较类似的:先去重统计课程和数量,然后筛选出大于或等于5的课程。

1、先去重统计课程和数量。在下面的临时结果就统计出了每个课程出现的次数

1
2
3
4
5
select
class
,count(distinct student)
from courses
group by class;

2、从上面的临时结果中筛选出大于或等于5的即可

1
2
3
4
5
6
7
8
select
class
from(select
class
,count(distinct student) as number -- 去重
from courses
group by class)temp -- 临时结果表
where number >= 5;

思路4

对现有的数据直接先去重得到一个中间结果表,然后对表的数据根据class分组统计找到大于或等于5的课程即可。

1、对现有数据的去重得到中间结果

1
2
3
select
distinct *
from courses

2、对上面的中间结果分组统计

1
2
3
4
5
6
7
8
select
class
from(
select
distinct *
from courses) t -- 临时表
group by class
having count(class) >= 5;

总结

本题中最大的陷阱就是有重修课程的同学,但是给出的数据中没有展现出来,所以上面的方法中都会出现去重的操作。除了第一种方法:根据课程和学生同时分组统计,本质上也是在去重。

本文标题:leetcode-for-sql-超过5名学生的课程

发布时间:2021年05月29日 - 10:05

原始链接:http://www.renpeter.cn/2021/05/29/leetcode-for-sql-%E8%B6%85%E8%BF%875%E5%90%8D%E5%AD%A6%E7%94%9F%E7%9A%84%E8%AF%BE%E7%A8%8B.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea