Как получить 3-й максимальный балл каждого студента по каждому предмету? - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь написать sql, который позволит мне выбрать 3-ую лучшую оценку каждого студента по каждому предмету. Я пытался с запросом ниже, но он не работает для меня. Буду благодарен за некоторые ответы. Я получаю ошибку [Code: 0, SQL State: 21000] ERROR: more than one row returned by a subquery used as an expression. Это структура таблицы «Студенты», «Курсы» (Id), промежуточная таблица «Студенческие курсы» (ID, StudentID, CourseID), а затем таблица назначений, которая имеет «Студенческий курс» (FK) и «Оценка»

select max(Assignments.Grade)
from Assignments
where grade < (select max(Assignments.Grade)
         from Assignments
         where grade  <  (select max(Assignments.Grade)
                         from Assignments
                         group by Assignments.StudentCourseID))
.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вы можете использовать оконные функции:

select *
from (
    select a.*, row_number() over(partition by student_id, subject_id order by grade desc)
    from assignments a
) a
where rn = 3

Ваш вопрос немного неясен относительно структуры таблицы assignments. Это предполагает, что учащегося идентифицируют по student_id, а по предмету - subject_id - многие из вас должны откорректировать это до фактических имен столбцов.

0 голосов
/ 08 апреля 2020

Использование row_number():

select a.*
from (select a.*,
             row_number() over (partition by student_id, StudentCourseID order by grade desc) as seqnum
      from assignments a
     ) a
where seqnum = 3;

Примечание. Если все назначения имеют одинаковое значение, будет возвращено самое высокое значение.

Если вы хотите третье по величине отличный счет, затем используйте dense_rank() вместо row_number().

...