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

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

一、数据

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

表: CoffeeShop

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| drink       | varchar |
+-------------+---------+
id 是该表的主键(具有唯一值的列)。
该表中的每一行都显示了订单 id 和所点饮料的名称。一些饮料行为 null。

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

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

查询结果格式示例如下。

示例 1:

输入: 
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"。
请注意,输出中的行与输入中的行相同。

二、分析

本人看到这个题目时,第一时间想到了LEAD和LAG函数,但是处理不了连续的空值,所以得换个方法。

能否将每个不为空的DRINK与仅仅为它下面为空的DRINK分为一组,然后按照组进行分组,使用max或者min函数进行填充,目前来看这个方法是可以的,如何实现?

第一步:因为表中的id数据是不规律的,而且最后需要返回 与输入顺序相同的 结果表。所以先使用排名函数对原表进行排名。

第二步:分组。使用SUM+窗口函数,先进行判断,如果DRINK为空,返回0,反之返回1,且数据按照第一步的排名进行排序,然后用SUM计算,这样,每个不为空的DRINK与仅仅为它下面为空的DRINK的SUM值为同一个。

第三步,使用MAX或者MIN+窗口函数,在窗口函数中按照第二步的SUM值进行分组,因为在每一个SUM值的组中,有且仅有一个不为空的DRINK,然后最外层使用MAX或者MIN函数将不为空的DRINK值取出。

最终得到答案。

三、代码

with t1 as (select id, drink, row_number() over () rn  -- 先进行排序from coffeeshop), t2 as (select id,drink,sum(casewhen drink is null then 0else 1end) over (order by rn) cnt,  -- 判断是否为空,让每个不为空的DRINK与仅仅为它下面为空的DRINK的SUM值为同一个rnfrom t1)
select id, min(drink) over (partition by cnt) drink  -- 按照t2的SUM值进行分组,然后将不为空的drink取出填充
from t2
order by rn;

四、总结

最后主查询中的聚合函数最好使用MAX或者MIN函数,不能使用COUNT或者SUM函数。

http://www.lryc.cn/news/490065.html

相关文章:

  • 【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量
  • Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(2)
  • HTML实现 扫雷游戏
  • day03(单片机高级)RTOS
  • 【mongodb】社区版8:改变配置bindip和授权
  • 泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性
  • 一线大厂面试集锦
  • 界面控件DevExpress Blazor UI v24.1新版亮点:发布全新文件输入等组件
  • ssm面向品牌会员的在线商城小程序
  • Vue 3 自定义插件开发
  • 使用最小花费爬楼梯(DP)
  • 【Ubuntu】如何在Ubuntu系统中查看端口是否可用
  • Hive基础面试-如何理解复用率的
  • Go 常量为什么只支持基本数据类型?
  • DatePicker 日期选择器的使用(当日、近一周、近一月...)
  • 【H2O2|全栈】JS进阶知识(六)ES6(2)
  • 聊聊主流几个JDK版本:JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
  • MFC工控项目实例三十二模拟量校正值添加修改删除
  • 力扣第 60 题 “第 k 个排列”
  • 国际环境和背景下的云计算领域
  • logstash 解析数组格式json数据:split, json
  • Linux的开发工具(二)
  • Bokeh实现大规模数据可视化的最佳实践
  • Oracle表碎片整理与优化
  • 【华为云函数工作流】python的函数中如何获取请求链接中带的参数
  • 最新Kali安装详细版教程(附安装包,傻瓜式安装教程)
  • 【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
  • 66 mysql 的 表自增长锁
  • 神经网络问题之一:梯度消失(Vanishing Gradient)