oracle - 在查询/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 |
非常感谢您提供的任何提示。
解决方案
您必须有办法对输入行进行完全排序。(“总”排序意味着“没有关系”。)
除此之外,您可以使用 轻松完成此操作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
子句,查询将计算累积值(累积计数、累积和)。
推荐阅读
- twilio - 无效的访问令牌标头 Twilio 可编程语音 React Native iOS
- python - 如何使用 args 将数组传递给 scipy.integrate.solve_ivp?
- ios - 在标签的右上角添加点
- sql - 如何在 dplyr::filter 中使用子查询
- amazon-web-services - 使用 SDK 检查 Cognito 域前缀的可用性
- postgresql - 在 postgres 中安装扩展
- python-import - 原子python-import-magic
- azure-data-factory - Azure 映射数据流中的参数化负载
- python - Plotly:如何使用 go.Bar 为组指定颜色?
- django - 电子表格,如 django 中的 UI 和功能