Курорт ранг после обновления - PullRequest
1 голос
/ 15 января 2020

Существует таблица учеников с их оценками:

studentid    studentscore    rank
----------------------------------
1             77              6
2             80              4
3             90              2
4             94              1
5             78              5
6             88              3

Тем не менее, оценки с ID 1 и 5 неверны, ID 1 должен быть 78, а ID 5 должен быть 77.

Я обновляю их оценки, но как прибегнуть к их разрядам?

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Более простой подход может заключаться в том, чтобы не хранить ранг в, а запрашивать его динамически, когда это необходимо:

SELECT studentid, studentscore, RANK() OVER (ORDER BY studentscore)
FROM   mytable
1 голос
/ 15 января 2020

Вот заявление об обновлении, которое вы можете использовать:

update students
set rankc = T1.Ranking
from students T2
left join (select RANK() OVER (ORDER BY studentscore desc) as Ranking
                  , studentid
           from students a ) T1
on T1.studentid   = T2.studentid

Вот это DEMO

Обратите внимание, что я переименовал ваш столбец "rank" в " ранг c "для этого примера.

1 голос
/ 15 января 2020

Как указывает @Mureinik, вы можете просто генерировать рейтинг на лету. Однако, если вам нужно сохранить его (возможно, из соображений производительности), вы можете обновить таблицу, используя CTE, с новыми рангами:

WITH ranks AS (
  SELECT studentid, RANK() OVER (ORDER BY studentscore DESC) AS [rank]
  FROM students
)
UPDATE s
SET s.[rank] = r.[rank]
FROM students s
JOIN ranks r ON s.studentid = r.studentid

После обновления значений studentscore для studentid 1 и 5, это вывод:

studentid   studentscore    rank
1           78              5
2           80              4
3           90              2
4           94              1
5           77              6
6           88              3

Демо на dbfiddle

...