Получите наивысшие оценки, набранные учениками в каждой школе - PullRequest
3 голосов
/ 17 марта 2019

У меня есть стол 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 ]

3 голосов
/ 17 марта 2019

Кажется, вы хотите оригинальные строки. Таким образом, один метод использует подзапрос с оконными функциями:

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 голос
/ 19 марта 2019

Вы можете использовать агрегатную функцию для получения желаемого результата.

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
1 голос
/ 17 марта 2019

Мы можем использовать оконную функцию dens_rank () . Подробнее о оконных функциях

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;
1 голос
/ 17 марта 2019

Это типичный вариант использования оконной функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...