【问题标题】:Selecting Names with Highest Aggregate in each Class选择每个类别中聚合度最高的名称
【发布时间】:2021-07-01 15:29:04
【问题描述】:

我是 SQL 新手,我正在使用以下表格:

CREATE TABLE Student (
  StudentID int,
  Name nvarchar(30),
  Class nvarchar(30)
);

INSERT INTO Student (StudentID, Name, Class) 
VALUES (1,'Alfredo','X'), (2,'Jack','X'), (3,'Chris','Y'), (4,'Paul','Y');

CREATE TABLE Subject (
  SubjectID int,
  Name nvarchar(30),
  Class nvarchar(30)
);
INSERT INTO Subject (SubjectID, Name, Class)
VALUES (1,'Maths','X'), (2, 'Science','X'), (3, 'English','Y'), (4, 'Arts','Y');


CREATE TABLE Performance (
  StudentID int,
  SubjectID int,
  Marks int
);

INSERT INTO Performance (StudentID, SubjectID, Marks)
VALUES 
(1,1,61),(1,2,75),
(2,1,82),(2,2,64),
(3,3,82),(3,4,83),
(4,3,77),(4,4,81);

我正在尝试编写一个查询来检索每个班级中总分最高的学生姓名。

我的预期输出是:

StudentID   Name    Marks   Class
2   Jack    146 X
3   Chris   165 Y

我尝试使用以下查询来合并表

SELECT * FROM Performance AS p

INNER JOIN
Student AS s
ON p.StudentId = s.StudentId

这个查询检索聚合标记

SELECT StudentID, SUM(MARKS) FROM Performance GROUP BY StudentID

我对如何合并这两个查询以实现我的目标一无所知。还有其他解决方法吗?

请指教

【问题讨论】:

  • 你使用的是哪个数据库?
  • 我正在使用 MySQL

标签: mysql sql groupwise-maximum


【解决方案1】:

你可以这样做:

select * from 
(
select s.StudentID, name, class
  , sum(marks) Marks,row_number() over (partition by class order by sum(marks) desc) rn 
from Performance p
join Student s
 on s.StudentID = p.StudentID
group by StudentID ,name,class
) t
where rn = 1

db小提琴here

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多