获得每所学校学生得分最高的分数

时间:2019-03-17 14:09:31

标签: sql sql-server

我有表STUDENT_MARKS

SCHOOL_ID   STUDENT_ID      TTL_MARKS
--------------------------------------
8           24              78
8           25              76
9           33              88
9           34              85
9           35              88
10          41              68
10          42              68
10          43              68

我的输出应该是:

SCHOOL_ID   STUDENT_ID      TTL_MARKS
--------------------------------------
8           24              78
9           33              88
9           35              88
10          41              68
10          42              68
10          43              68

我正在尝试执行此查询,但未成功::

SELECT 
    SCHOOL_ID, 
    STUDENT_ID, 
    MAX(TTL_MARKS) OVER(PARTITION BY SCHOOL_ID) 
FROM STUDENT_MARKS

如何在SQL Server中获得所需的结果?请帮忙!

4 个答案:

答案 0 :(得分:3)

您似乎想要原始行。因此,一种方法使用带有窗口函数的子查询:

select sm.*
from (select sm.*, max(sm.ttl_marks) over (partition by school_id) as max_ttl_marks
      from student_marks sm
     ) sm
where ttl_marks = max_ttl_marks;

此查询使用窗口函数来获取每个学校的最高分数。然后,外部查询将对行进行过滤,以便结果集中只有得分最高的学生。

答案 1 :(得分:1)

这是窗口函数RANK()的典型用例。当甚至有最高记录时,它们都将排在第一位。

SELECT school_id, student_id, ttl_marks
FROM (
    SELECT
        school_id, 
        student_id, 
        ttl_marks,
        RANK() OVER(PARTITION BY school_id ORDER BY ttl_marks DESC) as rn
    FROM student_marks
) s WHERE rn = 1

答案 2 :(得分:1)

我们可以使用窗口功能 dense_rank()Read more about window functions

select school_id,student_id,ttl_marks 
from 
    (select school_id,student_id,ttl_marks, 
    dense_rank() over (partition by school_id 
    order by ttl_marks desc)r from student_marks) 
where r = 1;

答案 3 :(得分:1)

您可以使用聚合函数来获得所需的结果。

WITH A AS 
(
    SELECT *,
        MAX(ttl_marks) OVER (PARTITION BY SCHOOL_ID ORDER BY TTL_MARKS DESC) HIGH_MARK
    FROM STUDENT_MARKS

 ) SELECT 
        SCHOOL_ID, 
        STUDENT_ID, 
        MAX(ttl_marks) 
    FROM A
    GROUP BY SCHOOL_ID, STUDENT_ID, HIGH_MARK
        HAVING MAX(ttl_marks) = HIGH_MARK