MySQL ранжирует столбец со связями - PullRequest
0 голосов
/ 23 января 2019

Имеется таблица баллов со следующей схемой

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

Я пробовал следующее:

SET @prev_value = NULL;
SET @rank_count = 0;
SELECT Id, Score, CASE
    WHEN @prev_value = Score THEN @rank_count
    WHEN @prev_value := Score THEN @rank_count := @rank_count + 1
END AS Rank
FROM Scores
ORDER BY Score

Чтобы получить

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

Но вместо этого я получаю эту ошибку:

Line 3: SyntaxError: near 'SET @rank_count = 0;
SELECT Id, Score, CASE
    WHEN @prev_value := Score THEN @'

Что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вы можете сосчитать все отличные оценки , которые больше, чем оценка каждой строки, и добавить 1 к результату:

select 
  s.score,
  ((select count(distinct score) from scores where score > s.score) + 1) rank
from scores s
order by s.score desc

См. Демонстрационную версию

0 голосов
/ 23 января 2019

Вы можете использовать переменные.Я думаю, что вам нужен только один запрос:

SELECT Id, Score,
       (CASE WHEN @prev_value = Score THEN @rank_count
             WHEN @prev_value := Score THEN @rank_count := @rank_count + 1
        END) AS Rank
FROM (SELECT s.*
      FROM Scores s
      ORDER BY Score s
     ) s CROSS JOIN
     (SELECT @prev_value := NULL, @rank_count := 0) params;

Более поздние версии MySQL требуют упорядочения в подзапросе.Конечно, самые последние версии предлагают DENSE_RANK(), что является предпочтительным.

0 голосов
/ 23 января 2019

В MySQL 8.x вы можете использовать функцию DENSE_RANK(), например:

select 
  Score,
  dense_rank() over(order by Score desc) as Rank
from Scores
order by Score desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...