Bir sıralama listesi belirlemek için SQL sorgusu

Bugün bir müşteri projesi üzerinde çalışırken şu görevle karşılaştım: "id" ve "score" sütunlarını içeren bir SQL "kullanıcı" tablosu alın ve aynı puana sahip kullanıcıların aynı sıralamayı aldığı "puan"a göre sıralanmış tüm kullanıcıların bir sıralama listesini belirleyin. Kullanıcı tanımlı değişkenler kullanılarak bu görev sezgisel ve kolay bir şekilde çözülebilir.


CREATE TABLE
    user(id INT, score INT);
INSERT INTO
    user(id, score)
VALUES
    (1, 10), (2, 40), (3, 55), (4, 10), (5, 5), (6, 20), (7, 30), (8, 70), (9, 30)

İki değişken kullanmak bunu basitçe çözer:

SET @score_prev = NULL;
SET @cur_rank = 0;
SELECT id, score, CASE
    WHEN @score_prev = score THEN @cur_rank
    WHEN @score_prev := score THEN @cur_rank := @cur_rank + 1
END AS rank
FROM user
ORDER BY score DESC

ve istediğiniz çıktıyı elde edersiniz:

+--------+-----------+----------+
|  *id*  |  *score*  |  *rank*  |
|    8   |      70   |      1   |
|    3   |      55   |      2   |
|    2   |      40   |      3   |
|    7   |      30   |      4   |
|    9   |      30   |      4   |
|    6   |      20   |      5   |
|    1   |      10   |      6   |
|    4   |      10   |      6   |
|    5   |       5   |      7   |
+--------+-----------+----------+
Geri