【发布时间】:2021-01-16 09:09:55
【问题描述】:
表格和数据:
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', 101),
(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),
(1002, 901, 76),
(1002, 903, 82),
(1003, 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, 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) a
group by a.major;
但缺少学生栏。
| major | Average |
| ------------ | ------- |
| Arquitecture | 87.0000 |
| Computing | 91.5000 |
谢谢。
【问题讨论】:
-
排除约翰的标准是什么?
-
@ntalbs John 正在学习计算,但 Cluade 的平均成绩更高。必须按专业分组,然后选择平均分较高的学生,例如 max(avg(grade))。
-
那么,是否要检索每个专业的高年级学生?
-
不对。已编辑。
标签: mysql sql inner-join average greatest-n-per-group