我有表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中获得所需的结果?请帮忙!
答案 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