SQL: выберите TOP N меток на пользователя (в списке пользователей) - PullRequest
1 голос
/ 25 февраля 2009

У меня проблемы с написанием хранимой процедуры, которая будет запрашивать список студентов с их ассоциативными отметками.

Получение списка студентов - тривиально Получение пяти лучших оценок для каждого учащегося - тривиально ... ВЫБЕРИТЕ ТОП (5) * ГДЕ StudentID = X

Сочетая эти два, я немного растерялся.

Я бы хотел, чтобы хранимая процедура возвращала две таблицы:

  • Первая таблица, в которой перечислены студенты по критериям
  • Вторая таблица: список оценок (по 5 на каждого учащегося в Первой таблице)

Второй стол - это когда сложно. Я могу получить все оценки на одного учащегося в первой таблице, но не уверен, как ограничить его до 5 лучших.

Ответы [ 2 ]

1 голос
/ 25 февраля 2009

Если вы используете SQL 2005 или выше, это должно работать. Если нет, то есть и другие немного более грязные способы сделать это.

WITH Student_Grades AS
(
    SELECT
        S.student_id,
        G.grade,
        RANK() OVER (PARTITION BY S.student_id, ORDER BY G.exam_date DESC) AS grade_rank
    FROM
        Students S
    LEFT OUTER JOIN Grades G ON
        G.student_id = S.student_id
)
SELECT
    student_id,
    grade
FROM
    Student_Grades
WHERE
    grade_rank <= 5
1 голос
/ 25 февраля 2009

Старайтесь избегать хранимой процедуры, которая возвращает 2 набора результатов. Сделайте это 2 отдельными процедурами.

TOP 5 возвращает случайные строки, если вы не указали порядок сортировки. Я полагаю, вы хотите отсортировать по классам. Вам понадобятся некоторые дополнительные критерии порядка сортировки, если все верхние оценки одинаковы. Например, вы можете вернуть последние 5 лучших оценок.

Что касается вашей второй процедуры по возвращению 5 лучших оценок на одного учащегося, изучите синтаксис предложения RANK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...