我正在做这个问题,
编写SQL查询以对分数进行排名。如果两者之间存在联系 分数,两者都应该具有相同的排名。请注意,打平后, 下一个排名数应该是下一个连续的整数值。在 换句话说,应该没有"漏洞"在队伍之间。
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
例如,给定上面的Scores表,您的查询应该生成 以下报告(按最高分数排序):
+-------+------+
| 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
为什么我需要这条线可以触发?
答案 0 :(得分:0)
这一行:
WHEN @rank := @rank + 1 THEN @rank
递增@rank
并返回递增的变量。它几乎完全等同于:
ELSE @rank := @rank + 1
(唯一的区别是NULL
值,但可能是值NULL
。)
逻辑是什么?当MySQL非零且非NULL时,MySQL将表达式解释为true。递增的正计数器将为非零且非NULL,因此when
子句为真。然后返回该值。