当前位置: 首页 > news >正文

【MySQL】临时变量用法

力扣题

1、题目地址

2388. 将表中的空值更改为前一个值

2、模拟表

表:CoffeeShop

Column NameType
idint
drinkvarchar
  • id 是该表的主键(具有唯一值的列)。
  • 该表中的每一行都显示了订单 id 和所点饮料的名称。一些饮料行为 null。

3、要求

编写一个解决方案将 drink 的 null 值替换为前面最近一行不为 null 的 drink。保证表第一行的 drink 不为 null。

返回 与输入顺序相同的 结果表。

查询结果格式示例如下。

示例 1:

输入:

CoffeeShop 表:

iddrink
9Rum and Coke
6null
7null
3St Germain Spritz
1Orange Margarita
2null

输出:

iddrink
9Rum and Coke
6Rum and Coke
7Rum and Coke
3St Germain Spritz
1Orange Margarita
2Orange Margarita

解释:

对于 ID 6,之前不为空的值来自 ID 9。我们将 null 替换为 “Rum and Coke”。
对于 ID 7,之前不为空的值来自 ID 9。我们将 null 替换为 “Rum and Coke”。
对于 ID 2,之前不为空的值来自 ID 1。我们将 null 替换为 “Orange Margarita”。
请注意,输出中的行与输入中的行相同。

4、代码编写

我的写法

思路:首先要求里面的输出顺序还是和原先一样,原先并没有按什么排序,所以我们得先对数据标上序号,这就可以用到窗口函数 row_numer,然后我们只需要在查询到 null 数据的时候,去查询比这个 null 数据的序号小的不为 null 的数据,然后根据序号倒序,取第一条即可,就能满足要求

里面需要注意的一点就是窗口函数 ROW_NUMBER() over()over 括号里面是不加分组和排序的

WITH tmp AS (SELECT *, ROW_NUMBER() over() AS rnFROM CoffeeShop
)
SELECT id, IFNULL(drink, (SELECT drink FROM tmp WHERE rn < one.rn AND drink IS NOT NULL ORDER BY rn DESC LIMIT 1)) AS drink
FROM tmp AS one

知识点

临时变量有两种用法:(temp 可以改成其他名)
1、使用 set,定义形式 set @temp=[var]

SET @temp=10;
SELECT @temp;

2、使用 select,定义形式 select @temp:=[var],下面两种都可以输出

SELECT @temp:=10;
SELECT @temp:=10;
SELECT @temp;

参考:mysql 临时变量

网友写法(临时变量用法)

SELECT id,@temp := IFNULL(drink, @temp) drink
FROM CoffeeShop

上面网友写法就是用的第二种用法,代码分析如下:

第 1 行:IFNULL 不为 null,将 Rum and Coke 赋值到 @temp 里面,并输出 SELECT @temp:= drink(drink='Rum and Coke')
第 2 行:IFNULLnull,将 @temp 赋值到 @temp 里面,并输出 SELECT @temp:=@temp(@temp='Rum and Coke'
第 3 行:IFNULLnull,将 @temp 赋值到 @temp 里面,并输出 SELECT @temp:=@temp(@temp='Rum and Coke'
第 4 行:IFNULL 不为 null,将 St Germain Spritz 赋值到 @temp 里面,并输出 SELECT @temp:= drink(drink='St Germain Spritz')
第 5 行:IFNULL 不为 null,将 Orange Margarita 赋值到 @temp 里面,并输出 SELECT @temp:= drink(drink='Orange Margarita')
第 6 行:IFNULLnull,将 @temp 赋值到 @temp 里面,并输出 SELECT @temp:=@temp(@temp='Orange Margarita'

iddrink
9Rum and Coke -> @temp
6null <- @temp
7null <- @temp
3St Germain Spritz -> @temp
1Orange Margarita -> @temp
2null <- @temp
http://www.lryc.cn/news/284158.html

相关文章:

  • Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫
  • Android在系统界面上添加窗口
  • 【正点原子STM32】STM32原理图设计(芯片手册和数据手册、常见引脚类型、最小系统和IO分配)
  • 低代码自动化平台| 游戏规则改变者
  • 【分享】MathWorks中国汽车年会:“软件定义汽车”
  • RNN:Long Short-term Memory(中)
  • C# .NET读取Excel文件并将数据导出到DataTable、数据库及文本
  • 移动云助力智慧交通数智化升级
  • 【Vue技巧】vue 阻止a链接跳转事件的两种方法
  • 006.Oracle事务处理
  • 成功解决VScode进入到内置函数中调试
  • 29、WEB攻防——通用漏洞SQL注入增删改查盲注延迟布尔报错
  • 【设计模式 行为型】策略模式
  • JVM:双亲委派机制类加载器
  • 从入门到精通:ThinkPHP6异步请求的全面解析!
  • C++写csv文件
  • 将Matlab图窗中的可视化保存为背景透明的矢量图
  • 希尔(Shell)排序
  • 【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案
  • 树莓派5 Ubuntu 23.04 安装 DisplayLink 驱动
  • SpringBoot 实现 PDF 添加水印有哪些方案
  • 【blender渲染】blender流体模拟基础
  • 小白进阶之字符串处理
  • 自定义Dubbo RPC通信协议
  • VB6.0报错:操作符AddressOf使用无效
  • SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】
  • 四、基础篇 vue条件渲染
  • 广东金牌电缆:法大大电子合同助力业务风险管控
  • 机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章
  • vue和react的hooks