sql leftjoin 如果为空不关联_SQL优化大神带你写有趣的SQL(9) 自定义变量的应用(2)...

大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

今天给大家带来的是 自定义变量的应用(2)

因为需求希望我,提供脚本,直接上脚本

with w1 as (
select 1 r1 , 'a' name, 1 num, null d1 from dual union all
select 2 r1 , null name, null num, '2014-1-1' d1 from dual union all
select 3 r1 , 'b' name, 2 num, null d1 from dual union all
select 4 r1 , null name, null num, '2013-4-1' d1 from dual union all
select 5 r1 , null name, null num, '2014-9-1' d1 from dual 
)
select
 w1.* 
 from w1 ;

3cd6b23cc662cb3606e9a009e57e0dbd.png

今天的需求是,如图所示的数据中,需要把d1为null的name,num数据填写到

向下的数据中 如下图所示

89385562b9ee9185592afb4cbe7d2429.png

一个问题,肯定有好几种解决方法,每个数据的特性不同解决方法也不一样,

在这里我用的是MySQL8.0版本还有最后会提供Oracle版本。

这里有一种相对传统且比较容易想到的思路是

1 求所有d1为空的行的结果集 w2

c0b7a326b11630cf4ebc768ad430c63c.png

2 使用标量子查询或者left join 都可以,这里使用标量子查询

满足 w1.r1>w2.r1 and w1.d1 is not null 的值当中w2.r1最大的值的行

d8063f7d0aa311b6aeca11bf4ff5d0cb.png

下面是最终的效果

2ea02ca6486d083c2054c9be9a48fdc8.png

第二种方法就是相对比较巧妙些

我们分析下原来的数据如下图

3cd6b23cc662cb3606e9a009e57e0dbd.png

在上图所示中,我们把1,2当作一组,3,4,5当作一组数据然后

使用聚合函数max(name),max(num)就可以得到我们想要的结果!

问题就是怎样才能把他们变成一组数据!!

我在这用了之前的方法请参考之前的 系列文章,使用了自定义变量

然后让他这里的name 为null的话保持不变,not null的话就+1 的形式

dc9eebf19cc7f59e8443bd5a7201d88a.png

这样我们就创造了一个列rn1 正好能满足我们的条件的组

之后可以使用窗口函数就 可以达到我们想要的结果了

a33728789959499b71a217848376fc7f.png

这里我用了一个非常好玩的窗口函数表达式!

window w as (partition by rn1 )

在写含有较多窗口函数的时候 可以使用上面的表达式,相对比较简洁

谢谢大家~ 欢饮转发

我是知数堂SQL 优化班老师~ ^^

我的微信公众号:SQL开发与优化(sqlturning)

我会在头条提供相应例子的视频,希望大家关注

头条号

c25948c12bc7a30b3da8823d204c959b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值