2010-05-05 4 views
3

Я использую SQL Server 2008. У меня есть таблица Student, в которой есть следующие поля: 1. StudentId, 2. StudentName, 3. Marks. Я хочу получить набор результатов, в котором должен быть столбец с именем «Позиция». Что-то вроде «Select StudentId, StudentName, Marks, as Position from Student ...», так что, в зависимости от отмеченных студентом баллов, я могу оценить их как 1, 2 или 20 позицию. Если ученики имеют одинаковые знаки, то они имеют одинаковую позицию. Спасибо. RhysSQL Server: позиция на основе меток

ответ

7

Использование RANK:

Если два или более рядов связать для ранга, каждые привязанные строки получают одинаковый ранг. Например, если у двух топ-менеджеров есть одинаковое значение SalesYTD, они оба ранжируются. Продавца со следующим самым высоким SalesYTD занимает третье место, потому что есть две строки, которые ранжируются выше. Поэтому функция RANK не всегда возвращает последовательные целые числа.

Запрос может выглядеть следующим образом:

SELECT 
    StudentId, 
    StudentName, 
    Marks, 
    RANK() OVER (ORDER BY Marks DESC) AS Position 
FROM Student 
+1

Вот документации MSDN для ранжирования функций: http://msdn.microsoft.com/en-us/library/ms189798.aspx – David

+0

+1 отлично, я думал ROW_NUMBER(), но RANK() отлично справляется с дублирующими знаками –

1

Вы можете использовать подзапрос для вычисления местоположения. Положение просто еще один, чем число студентов с более высокой отметкой:

select 
    s.StudentId, s.StudentName, s.Marks, 
    Position = 1 + (select count(*) from Students m where m.Marks > s.Marks) 
from 
    Students s 
+0

Спасибо за простой быстрый ответ. Он сделал это для меня. Я также понял, что функция DENSE_RANK(), предложенная Марк Байерсом, тоже делает трюк. :-) – Rhys

Смежные вопросы