首页 > 解决方案 > 在查询/Oracle 数据库中动态增加数字

问题描述

我的数据如“原始数据”列中所示。我想得到如“结果”列中所示的结果。有什么办法可以用 Oracle SQL 函数做到这一点?Oracle 版本是 12c Release 12.1.0.1.0。

原始数据 结果
0 0
0 0
1 1
1 2
1 3
0 0
0 0
0 0
0 0
1 1
1 2
1 3
1 4
1 5
1 6
0 0
0 0

非常感谢您提供的任何提示。

标签: oracle

解决方案


您必须有办法对输入行进行完全排序。(“总”排序意味着“没有关系”。)

除此之外,您可以使用 轻松完成此操作match_recognize,如下所示。在输出中,我包含了排序列(我假设是一个数字列,但它可以是日期等 - 无论您可以使用什么来对输入进行完全排序),并且我包含了原始值和新值;如果您只需要新值,则可以在select子句中控制它。

子句中的输入数据with只是为了方便测试;您将需要删除它,并在查询中使用您的实际表名和列名。

with
  sample_inputs (ord, val) as (
    select  1, 0 from dual union all
    select  2, 0 from dual union all
    select  3, 1 from dual union all
    select  4, 1 from dual union all
    select  5, 1 from dual union all
    select  6, 0 from dual union all
    select  7, 0 from dual union all
    select  8, 0 from dual union all
    select  9, 0 from dual union all
    select 10, 1 from dual union all
    select 11, 1 from dual union all
    select 12, 1 from dual union all
    select 13, 1 from dual union all
    select 14, 1 from dual union all
    select 15, 1 from dual union all
    select 16, 0 from dual union all
    select 17, 0 from dual
  )
select ord, val, new_val
from   sample_inputs
match_recognize (
  order by ord
  measures count(a.val) as new_val
  all rows per match
  pattern  ( a+ | b+ )
  define   a as val = 1, b as val = 0
);

输出:

       ORD        VAL    NEW_VAL
---------- ---------- ----------
         1          0          0
         2          0          0
         3          1          1
         4          1          2
         5          1          3
         6          0          0
         7          0          0
         8          0          0
         9          0          0
        10          1          1
        11          1          2
        12          1          3
        13          1          4
        14          1          5
        15          1          6
        16          0          0
        17          0          0

这假设您的意图是“计算”这些值(而不是,例如,“求和”它们)。如果所有输入值都是 0 和 1,则没有区别。如果您可能还有其他非零值(1 除外),并且您必须“求和”它们而不是计算它们,那么这是对查询的简单修改 -sum(val)measures子句中使用。在这两种情况下,使用该all rows per match子句,查询将计算累积值(累积计数、累积和)。


推荐阅读