如何解决各专业平均成绩较高的学生
表和数据:
CREATE TABLE major
(
id INT PRIMARY KEY,name VARCHAR(200)
);
insert into major values
(101,'Computing'),(102,'Arquitecture');
CREATE TABLE student
(
id INT PRIMARY KEY,name VARCHAR(200),major_id INT,foreign key(major_id) references major(id)
);
insert into student values
(1001,'Claude',101),(1002,'John',(1003,'Peter',102);
CREATE TABLE course
(
id INT PRIMARY KEY,name VARCHAR(200)
);
insert into course values
(901,'Databases'),(902,'Java'),(903,'Artificial Intelligence'),(904,'OOP');
CREATE TABLE grades
(
student_id INT,course_id INT,grade integer,primary key (student_id,course_id),foreign key(student_id) references student(id),foreign key(course_id) references course(id)
);
insert into grades values
(1001,903,95),(1001,904,88),901,76),82),902,87);
预期:
| student | major | grade |
| ---------- | -------------| ----- |
| Peter | Architecture | 87 |
| Claude | Computing | 91.5 |
换句话说:检索每个专业的高年级学生。
游乐场here。
如果可能,没有TOP,LIMIT。
如果可能的话,请使用旧的ANSI SQL以及使用窗口函数。
使用MySQL引擎,但不是必需的。
我的方法#1:
-- average grade by student
select s.name as Student,m.name as Major,avg(g.grade) as Average
from student s
inner join grades g on (s.id = g.student_id)
inner join major m on (m.id = s.major_id)
group by s.id
但不需要约翰:
| Student | Major | Average |
| ------- | ------------ | ------- |
| Claude | Computing | 91.5000 |
| John | Computing | 79.0000 |
| Peter | Arquitecture | 87.0000 |
我的方法#2:
-- Max average grade by career; lacks student
select a.major,max (a.average) as Average
from (select s.name as Student,avg(g.grade) as average
from student s
inner join grades g on (s.id = g.student_id)
inner join major m on (m.id = s.major_id)
group by s.id) a
group by a.major;
但缺少学生专栏。
| major | Average |
| ------------ | ------- |
| Arquitecture | 87.0000 |
| Computing | 91.5000 |
谢谢。
解决方法
如果您正在运行MySQL 8.0,则可以使用rank()
进行此操作:
select *
from (
select s.name as student,m.name as major,avg(g.grade) as average,rank() over(partition by m.id order by avg(g.grade) desc) rn
from student s
inner join grades g on s.id = g.student_id
inner join major m on m.id = s.major_id
group by s.id,m.id
) t
where rn = 1
注意:
-
rank()
允许联系
联接条件周围的 -
括号是多余的
您可以结合使用两个查询:
[0,5] (5,10] (10,15]
a 0 1 0
b 0 0 0
c 1 2 2
d 0 1 0
,
对于旧版本的MySQL ...
SELECT x.*
FROM
( SELECT m.name major,s.name student,AVG(grade) avg_grade
FROM major m
JOIN student s
ON s.major_id = m.id
JOIN grades g
ON g.student_id = s.id
GROUP
BY major,student
) x
JOIN
(
SELECT major,MAX(avg_grade) avg_grade
FROM
( SELECT m.name major,AVG(grade) avg_grade
FROM major m
JOIN student s
ON s.major_id = m.id
JOIN grades g
ON g.student_id = s.id
GROUP
BY major,student
)n
GROUP
BY major
) y
ON y.major = x.major
AND y.avg_grade = x.avg_grade
| major | student | avg_grade |
| ------------ | ------- | --------- |
| Arquitecture | Peter | 87.0000 |
| Computing | Claude | 91.5000 |
---
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。