如何获得每个科目获得最高分的学生的姓名?

Chi*_*ntu 4 sql sql-server sql-server-2005 sql-server-2008 sql-server-2008-r2

我有下表

 Name  |  Subject  | Marks
 --------------------------
 a        M          20
 b        M          25  
 c        M          30
 d        C          44 
 e        C          45
 f        C          46 
 g        H          20
Run Code Online (Sandbox Code Playgroud)

在这里,我有一个“学生”表,我想
从学生表中获取从每个科目获得最高分的学生的姓名,如下面的输出。

 Name | Subject | Marks  
 c        M        30
 f        c        46
 g        h        20
Run Code Online (Sandbox Code Playgroud)

Seb*_*ine 9

您可以使用 ROW_NUMBER 函数只返回每个主题的“最佳”行:

SQL小提琴

MS SQL Server 2008 架构设置

CREATE TABLE Student
    ([Name] varchar(1), [Subject] varchar(1), [Marks] int)
;

INSERT INTO Student
    ([Name], [Subject], [Marks])
VALUES
    ('a', 'M', 20),
    ('b', 'M', 25),
    ('c', 'M', 30),
    ('d', 'C', 44),
    ('e', 'C', 45),
    ('f', 'C', 46),
    ('g', 'H', 20)
;
Run Code Online (Sandbox Code Playgroud)

查询 1

SELECT Name, Subject, Marks
FROM(
  SELECT *, ROW_NUMBER()OVER(PARTITION BY Subject ORDER BY Marks DESC) rn
    FROM dbo.Student
)X
WHERE rn = 1
Run Code Online (Sandbox Code Playgroud)

结果

| NAME | SUBJECT | MARKS |
--------------------------
|    f |       C |    46 |
|    g |       H |    20 |
|    c |       M |    30 |
Run Code Online (Sandbox Code Playgroud)