首页 > 解决方案 > 基于前一列值的列值

问题描述

我在 Oracle 上有一个结果集,如下表:

在此处输入图像描述

有没有办法添加一个新列,其值基于之前的 TEMREGIONAL 列,如下所示:

311,1,1,0
430,2,0,1
329,3,0,1

我想要的是基于 TEMREGIONAL 值,如果它是 1,那么之后的所有行都将是 1。

所以,如果我有这样的事情:

311,1,0
430,2,0
329,3,1
334,4,0
323,5,0
324,6,0
326,7,0

结果应该是:

311,1,0,0
430,2,0,0
329,3,1,0
334,4,0,1
323,5,0,1
324,6,0,1
326,7,0,1

我想要的是添加一个新列,在第三列值为 1 的行之后,所有行在这个新列中的值都应该为 1。

任何人都可以帮助我吗?

标签: oraclefunctionoracle11gwindow

解决方案


您可以使用ignore nulls加法lag来查找上一个1,将零变为null。这可以一次性完成。

with a(
  ID_ORGAO_INTELIGENCIA
  , ORD
  , TEMREGIONAL
) as (
select 311,1,0 from dual union all
select 430,2,0 from dual union all
select 329,3,1 from dual union all
select 334,4,0 from dual union all
select 323,5,0 from dual union all
select 324,6,0 from dual union all
select 326,7,0 from dual
)
select
  a.*
  , coalesce(
      lag(nullif(TEMREGIONAL, 0))
      ignore nulls
      over(order by ord asc)
    , 0) as prev
from a
ID_ORGAO_INTELIGENCIA | 订单 | 区域 | 上一篇
--------------------: | --: | ----------: | ---:
                  311 | 1 | 0 | 0
                  430 | 2 | 0 | 0
                  329 | 3 | 1 | 0
                  第334章 4 | 0 | 1
                  323 | 5 | 0 | 1
                  324 | 6 | 0 | 1
                  326 | 7 | 0 | 1

db<>在这里摆弄


推荐阅读