【问题标题】:sql with case when selection选择时带有大小写的sql
【发布时间】: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++ 或其他语言,请考虑 '=' 和 '==' 之间的区别。':=' 用于伪代码。您可以通过谷歌搜索“冒号等于运算符”来搜索类似的内容。
  • 这一行只是用来增加计数器。

标签: mysql sql


【解决方案1】:

这一行:

WHEN @rank := @rank + 1 THEN @rank

它正在递增@rank 并返回递增的变量。它几乎完全等同于:

ELSE @rank := @rank + 1

(唯一的区别是NULL 的值,但可能不是NULL。)

逻辑是什么?当表达式非零且非 NULL 时,MySQL 将表达式解释为 true。递增的正计数器将非零且非 NULL,因此 when 子句为真。然后返回该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多