文章目录
- 1 题目描述
- 2 测试用例
- 3 解题思路
1 题目描述
表: CoffeeShop
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| drink | varchar |
+-------------+---------+
id 是该表的主键(具有唯一值的列)。
该表中的每一行都显示了订单 id 和所点饮料的名称。一些饮料行为 null。
编写一个解决方案将 drink 的 null
值替换为前面最近一行不为 null
的 drink。保证表第一行的 drink 不为 null
。
返回 与输入顺序相同的 结果表。
2 测试用例
输入:
CoffeeShop 表:
+----+-------------------+
| id | drink |
+----+-------------------+
| 9 | Rum and Coke |
| 6 | null |
| 7 | null |
| 3 | St Germain Spritz |
| 1 | Orange Margarita |
| 2 | null |
+----+-------------------+
输出:
+----+-------------------+
| id | drink |
+----+-------------------+
| 9 | Rum and Coke |
| 6 | Rum and Coke |
| 7 | Rum and Coke |
| 3 | St Germain Spritz |
| 1 | Orange Margarita |
| 2 | Orange Margarita |
+----+-------------------+
解释:
对于 ID 6,之前不为空的值来自 ID 9。我们将 null 替换为 “Rum and Coke”。
对于 ID 7,之前不为空的值来自 ID 9。我们将 null 替换为 “Rum and Coke”。
对于 ID 2,之前不为空的值来自 ID 1。我们将 null 替换为 “Orange Margarita”。
请注意,输出中的行与输入中的行相同。
3 解题思路
- 使用
IFNULL
判断drink
是否为 null,如果为 null 则赋值为@pre_value
的值,使用自定义变量@pre_value
存储最近一次非 null 的drink
值
select id, @pre_value := IFNULL(drink, @pre_value) as drink
from CoffeeShop
执行结果
+--+-----------------+
|id|drink |
+--+-----------------+
|9 |Rum and Coke |
|6 |Rum and Coke |
|7 |Rum and Coke |
|3 |St Germain Spritz|
|1 |Orange Margarita |
|2 |Orange Margarita |
+--+-----------------+