首页 > 解决方案 > SQL MAX() 分组

问题描述

表:

student(sid, sname, sex, age, year, gpa)

major(dname, sid)

问题:对于每个系有超过 15 名学生的系,我们要打印有关系内 GPA 最高的学生的信息。特别是,对于每个这样的学生,我们要打印学生 ID、学生姓名和 GPA,以及该学生主修的部门名称。

到目前为止,我有:

SELECT student.sid, student.sname, student.gpa, major.dname
FROM student 
RIGHT JOIN major ON student.sid = major.sid 
WHERE student.gpa IN (
    SELECT  MAX(gpa) 
    FROM student JOIN major ON student.sid = major.sid
    GROUP BY dname
    HAVING COUNT(dname) > 15
)

但它并没有给我准确的查询。student.gpaIN 中的子句有效,但以这种方式放在一起时,它实际上与dname最大 GPA不匹配。我在这里做错了什么?

此查询给出:

在此处输入图像描述

我需要:

在此处输入图像描述

标签: sqlsql-server

解决方案


如果将WHERE ... IN语句更改为INNER JOIN,则可以连接更多字段。

SELECT student.sid, student.sname, student.gpa, major.dname
FROM student 
RIGHT JOIN major 
  ON student.sid = major.sid 
INNER JOIN (
  SELECT  MAX(gpa) as max_gpa, dname
  FROM student JOIN major ON student.sid=major.sid
  GROUP BY dname
  HAVING COUNT(dname)>15
) as dept_gpa
  ON student.gpa = dept_gpa.max_gpa
    AND major.dname = dept_gpa.dname

推荐阅读