大家好,我是知数堂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 ;
今天的需求是,如图所示的数据中,需要把d1为null的name,num数据填写到
向下的数据中 如下图所示
一个问题,肯定有好几种解决方法,每个数据的特性不同解决方法也不一样,
在这里我用的是MySQL8.0版本还有最后会提供Oracle版本。
这里有一种相对传统且比较容易想到的思路是
1 求所有d1为空的行的结果集 w2
2 使用标量子查询或者left join 都可以,这里使用标量子查询
满足 w1.r1>w2.r1 and w1.d1 is not null 的值当中w2.r1最大的值的行
下面是最终的效果
第二种方法就是相对比较巧妙些
我们分析下原来的数据如下图
在上图所示中,我们把1,2当作一组,3,4,5当作一组数据然后
使用聚合函数max(name),max(num)就可以得到我们想要的结果!
问题就是怎样才能把他们变成一组数据!!
我在这用了之前的方法请参考之前的 系列文章,使用了自定义变量
然后让他这里的name 为null的话保持不变,not null的话就+1 的形式
这样我们就创造了一个列rn1 正好能满足我们的条件的组
之后可以使用窗口函数就 可以达到我们想要的结果了
这里我用了一个非常好玩的窗口函数表达式!
window w as (partition by rn1 )
在写含有较多窗口函数的时候 可以使用上面的表达式,相对比较简洁
谢谢大家~ 欢饮转发
我是知数堂SQL 优化班老师~ ^^
我的微信公众号:SQL开发与优化(sqlturning)
我会在头条提供相应例子的视频,希望大家关注
头条号