文章目录
- 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 |
+--+-----------------+