【发布时间】:2015-01-13 02:06:11
【问题描述】:
我正在做这个问题,
编写一个 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
那我为什么需要,当这条线可以触发时?
【问题讨论】:
-
"这条线什么时候可以触发?" - 嗯,什么?还有,是oracle还是mySQL?
-
如果你问 := 是什么意思,那句话本质上是在说“当 rank 等于 rank + 1 时”。在这种情况下,等号不是等级到等级的分配,它是说它在数学上等于(如果您使用 C++ 或其他语言,请考虑 '=' 和 '==' 之间的区别。':=' 用于伪代码。您可以通过谷歌搜索“冒号等于运算符”来搜索类似的内容。
-
这一行只是用来增加计数器。