碰到一个操蛋的分析函数问题,lead/lag() over ()

本文介绍了一种复杂的SQL更新操作,利用MERGE与LEAD函数结合B表条件,实现A表特定字段的高效批量更新。

A表:

select t.*, t.rowid from a t order by to_number(a1);

   A1A2A3A4A5A6
111A1A11
222A2A11
333A3A11
441B1B11
552B2B11
661C4C11
772C3C11
883C2C11
994C1C11
10101A3A-11
11112A2A-11
12123A1A-11

B表:
select t.*, t.rowid from b t order by to_number(b1);

   B1B2B3
11A1A2
22A2A3
33B1B2
44C4C3
55C3C2
66C2C1
77A3A2
88A2A1
99B2B1
1010C1C2
1111C2C3
1212C3C4
1313C4C2

前天面试,面试官提出来了个这样操蛋的问题,如下描述:

A表中的A6字段要更新值,更新的值是从哪个来的?

A6要更新的值是由本条记录与下一级记录,是否在B表中B2,B3有对应关系确定,如果有对应关系,那么A6=B1,而且是以A4来分组的****而且是一条SQL来搞定,我操!,当时没做出来,回头上网上才找到的答案 。

例:我要更新A1='1' 的第一个记录里面的A6,那个,首先会对比A1='1'的A3与下一条 A1='2'这条记录的A3,那个,在B表中,我们可以看到第一行1 ,A1,A2 有这样的记录,那么A表中的A6=1 ,如果没有对应关系,肯定不更新了。

SQL:

merge into a
using (select b.b1, c.a1, c.a3, c.a7
         from (select a.a1,
                      a.a3,
                      lead(a3, 1) over(partition by a4 order by to_number(a1)) as a7
                 from a
                order by to_number(a1)) c,
              b
        where c.a7 = b.b3
          and c.a3 = b.b2) k
on (a.a1 = k.a1)
when matched then
  update set a.a6 = k.b1;

显示结果:

select t.*, t.rowid from a t order by to_number(a1);

   A1A2A3A4A5A6
111A1A111
222A2A112
333A3A11
441B1B113
552B2B11
661C4C114
772C3C115
883C2C116
994C1C11
10101A3A-117
11112A2A-118
12123A1A-11

 

看到A6的结果了么,一条就搞定了。最关键就是红色部分啦。

lead(a3, 1) over(partition by a4 order by to_number(a1)

LAG         : 可以访问结果集中的其它行而不用进行自连接

LEAD        : LEAD 与 LAG 相反, LEAD 可以访问组中当前行之后的行

select a.a1,
                      a.a3,
                      lead(a3, 1) over(partition by a4 order by to_number(a1)) as a7
                 from a
                order by to_number(a1)

的执行结果:

   A1A3A7
11A1A2
22A2A3
33A3
44B1B2
55B2
66C4C3
77C3C2
88C2C1
99C1
1010A3A2
1111A2A1
1212A1

A7 列就是使用分析函数得到的列,lead(a3,1)就是取a3列的下1个值,如果是lead(a4,3),那就是取a4列下的第3个值。很简单了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值