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 | +--------+-----------+----------+