首页 > 解决方案 > 查找参加 SQL 课程最多的学生

问题描述

假设有一个学生表,其中包含学生 ID、学期 ID 和每学期修读的课程数量:

student    semester    num_courses
10001      23          3
10002      23          5
10003      23          1
10004      25          2
10005      25          3
10003      25          5
10000      26          4
10013      26          2
...

我怎样才能找到每学期参加最多课程的学生?

预期输出为:

student    semester    num_courses
10002      23          5
10003      25          5
10000      26          4
...

我想过使用OVER PARTITION BY,但我不确定如何正确使用这种类型的查询。我得到的没有按预期工作。

SELECT s.student, s.semester, MAX(s.num_courses) OVER (PARTITION BY s.semester) AS max
FROM students s; 

标签: sqlpostgresql

解决方案


你的想法很好。现在您有了学生的学期课程数和最大学期课程数,比较两者:

SELECT semester, num_courses, student
FROM
(
  SELECT
    student,
    semester, 
    num_courses,
    MAX(num_courses) OVER (PARTITION BY semester) AS semester_max_num_courses
  FROM students s
) with_max
WHERE num_courses = semester_max_num_courses
ORDER BY semester, student;

另一种方法是选择所有最大学期课程数,然后使用它来获取学生:

SELECT semester, num_courses, student
FROM students
WHERE (semester, num_courses) IN
(
  SELECT semester, MAX(num_courses)
  from students
  GROUP BY semester
)
ORDER BY semester, student;

推荐阅读