首页 > 解决方案 > 根据 MySQL 中的三列从一列中挑选并仅显示最高值

问题描述

嘿!

我到处搜索,但找不到正确的方法来选择同一主题内每个学生的最高结果。所以 studentnr 是表中学生的 ID,emnekode 是主题代码,karakter 是结果,A 为最高,F 为最低。

关于如何使它工作的任何建议?我会很感激。

这是到目前为止的代码,输出如下:

SELECT Eksamensresultat.*, Emnenavn, Studiepoeng
FROM Eksamensresultat, Emne
WHERE Eksamensresultat.Emnekode = Emne.Emnekode 
ORDER BY RIGHT (Eksamensresultat.Emnekode, 4) ASC;

我希望输出是这样的(结果 B 除外,因为该学生的 A 更高):

输出(图片)

这是两张表:

CREATE TABLE Emne
(
Emnekode CHAR(8) NOT NULL,
Emnenavn CHAR(40) NOT NULL,
Studiepoeng DECIMAL(3, 1),
CONSTRAINT EmnekodePK PRIMARY KEY(Emnekode)
);
CREATE TABLE Eksamen
(
Emnekode CHAR(8) NOT NULL,
Dato DATE NOT NULL,
Romnr CHAR(4) NOT NULL,
CONSTRAINT EksamenPK PRIMARY KEY(Dato,Emnekode),
CONSTRAINT EksamenEmneFK FOREIGN KEY(Emnekode) REFERENCES Emne(Emnekode),
CONSTRAINT EksamenRomFK FOREIGN KEY(Romnr) REFERENCES Rom(Romnr)
);

数据:

INSERT INTO Emne (Emnekode, Emnenavn, Studiepoeng) VALUES
("PRG1000", "Grunnleggende programmering 1", 7.5),
("PRG1100", "Grunnleggende programmering 2", 7.5),
("WEB1100", "Webutvikling og HCI", 7.5),
("SYS1000", "Systemutvikling", 7.5),
("ORL1100", "Organisering", 7.5);
INSERT INTO Eksamensresultat(Karakter,Studentnr,Emnekode,Dato) VALUES
("A","240202","PRG1000","20210505"),
("C","240202","PRG1100","20210506"),
("B","240202","SYS1000","20210507"),
("A","225087","PRG1100","20210506"),
(NULL,"225087","SYS1000","20210507"),
(NULL,"240225","SYS1000","20210507"),
(NULL,"884642","SYS1000","20210507"),
("C","139959","PRG1000","20210505"),
("B","240202","PRG1000","20210606");

标签: mysqlsqldatabase

解决方案


如果我理解正确,你想要ROW_NUMBER(),所以你可以为每个学生/考试选择一行,其中较高的Karakter

SELECT er.*
FROM (SELECT er.*, e.Emnenavn, e.Studiepoeng,
             ROW_NUMBER() OVER (PARTITION BY er.Studentnr, er.Emnekode ORDER BY er.Karakter DESC) as seqnum
      FROM Eksamensresultat er JOIN
           Emne e
           ON er.Emnekode = e.Emnekode 
     ) er
WHERE er = 1
ORDER BY RIGHT(Emnekode, 4) ASC;

推荐阅读