Сортировка результатов и определение совместных позиций

#mysql #sql

#mysql #sql

Вопрос:

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

например

 name    score
andy    50
brian   56
chris   65
david   56
eddie   71
fred    50
greg    40
  

Я хочу запустить запрос, чтобы предоставить мне список учащихся, упорядоченных по баллам (легко), а также их положение в классе. Мне нужно рассмотреть совместные позиции.

Например, студент с наивысшим баллом занимает позицию 1, если два лучших студента имеют одинаковый балл, то они оба занимают позицию 1, а затем следующий студент с лучшими результатами должен занимать позицию 3

Вот как я хотел бы, чтобы отображались данные, перечисленные ранее:

 name    score   position
eddie   71      1
chris   65      2
brian   56      3
david   56      3
andy    50      5    
fred    50      5
greg    40      7
  

Как я могу адаптировать этот запрос, чтобы включить точное положение?

 select name, score, '?' as position from students order by score
  

Ответ №1:

Вы ищете rank() :

 select s.*, rank() over (order by score desc) as position
from students;
  

Это доступно, начиная с MySQL 8.0.

Комментарии:

1. Отлично — я сразу же приступлю к этому. Я ценю помощь.

Ответ №2:

используйте этот запрос, если вы работаете с MSSQL2019

     SELECT
        name,
        score,
        RANK () OVER ( 
            ORDER BY score DESC
        ) position 
    FROM
        score
  
 name    score   position
b        75        1
a        70        2
c        65        3
d        50        4
e        50        4
f        40        6