首页 > 解决方案 > 在同一列中计算 1 之间的零

问题描述

我有这样的数据。

ID  IND
1   0
2   0
3   1
4   0
5   1
6   0
7   0

我想在值 1 之前计算零。这样,输出将如下所示。

ID  IND  OUT
1   0    0
2   0    0
3   1    2
4   0    0
5   1    1
6   0    0
7   0    2

没有pl/sql可以吗?我试图找到行号之间的差异,但无法实现。

标签: sqloracle

解决方案


Oracle 12.1 中引入的该match_recognize子句可以快速解决此类“行模式识别”问题。由于对 ID = 0 的“最后一行”进行了特殊处理,该解决方案有点复杂,但除此之外它很简单。

像往常一样,该with子句不是解决方案的一部分;我包括它来测试查询。删除它并使用您的实际表名和列名。

with
  inputs (id, ind) as (
    select 1, 0 from dual union all
    select 2, 0 from dual union all
    select 3, 1 from dual union all
    select 4, 0 from dual union all
    select 5, 1 from dual union all
    select 6, 0 from dual union all
    select 7, 0 from dual
  )
select id, ind, out
from   inputs
match_recognize(
  order by id
  measures case classifier() when 'Z' then 0 
                             when 'O' then count(*) - 1
                             else          count(*)     end as out
  all rows per match
  pattern  ( Z* ( O | X ) )
  define   Z as ind = 0, O as ind != 0
);

        ID        IND        OUT
---------- ---------- ----------
         1          0          0
         2          0          0
         3          1          2
         4          0          0
         5          1          1
         6          0          0
         7          0          2

推荐阅读