繁体   English   中英

查找参加课程最多的学生 SQL

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM