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