我在做这个问题,
编写 SQL 查询以对分数进行排名。如果两者之间有联系 分数,两者应该具有相同的排名。请注意,在平局之后, 下一个排名数字应该是下一个连续的整数值。在 换句话说,等级之间不应该有"漏洞"。
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
例如,给定上面的分数表,您的查询应生成 以下报告(按最高分排序):
+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
答案是:
在下面编写您的 MySQL 查询语句
SELECT Score,
CASE
WHEN @prev = Score THEN @rank
WHEN @prev := Score THEN @rank := @rank + 1
WHEN @rank := @rank + 1 THEN @rank
END AS Rank
FROM Scores, (SELECT @rank := 0, @prev := NULL) r
ORDER BY Score DESC
我不明白这一部分:
WHEN @rank := @rank + 1 THEN @rank
那么,当这条线可以触发时,我为什么需要呢?
这一行:
WHEN @rank := @rank + 1 THEN @rank
它递增@rank
并返回递增的变量。 它几乎完全等同于:
ELSE @rank := @rank + 1
(唯一的区别是NULL
值,但大概该值不是NULL
。
逻辑是什么? MySQL将表达式解释为真,当它为非零和非空时。 递增的正计数器将是非零和非 NULL,因此 when
子句为 true。 然后返回该值。