[英]Find students who take most courses 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
...
我怎样才能找到每学期参加最多课程的学生?
预期的 output 将是:
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;
你的想法很好。 现在您有了学生的学期课程数和最大学期课程数,比较两者:
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 所有最大学期课程计数,然后使用它来获取学生:
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;
使用 row_number() 您可以轻松地获得以 num_courses 降序排列的序列号。 然后只需为每个半学期选择具有第一个序列号的行。
子查询:
select student ,semester, num_courses from
(
Select student ,semester, num_courses, row_number()over(partition by semester
order by num_courses desc)rn from students
)t
where rn=1
公用表表达式
With cte as
(
Select student ,semester, num_courses, row_number()over(partition by semester
order by num_courses desc)rn from students
)
select student ,semester, num_courses from cte where rn=1
另一种方法,如果一个以上的学生有最大数量的课程
WITH cte as
(
SELECT s.semester, MAX(s.num_courses) as num
FROM students s
GROUP BY s.semester
)
SELECT s.student, s.semester, s.num_courses FROM students s JOIN cte on s.semester =
cte.semester
WHERE cte.num = s.course
ORDER BY s.semester
如果你想要每学期一排,那么在 Postgres 中,我会推荐distinct on
:
select distinct on (semester) s.*
from students s
order by semester, num_courses desc;
如果您希望所有学生人数最多,那么 Thorsten 的答案是合适的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.