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 "puan" sütunlarına sahip bir SQL tablosu "kullanıcı" alın ve tüm kullanıcıların hangi "puana" göre sıralandığını belirleyin aynı puanla aynı sıralamayı alır. Bu görev, kullanıcı tanımlı değişkenler kullanılarak 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