我有以下数据,由A值组成,按MM(月)排序。
A
MM
该B列的计算方式类似于GREATEST(current value of A + previous value of B, 0)电子表格。
B
GREATEST(current value of A + previous value of B, 0)
如何B使用SQL查询进行计算?
我正在使用Oracle 10g,因此不能使用递归查询。
这是我的测试数据:
MM | A | B -----------+--------+------ 2012-01-01 | 800 | 800 2012-02-01 | 1900 | 2700 2012-03-01 | 1750 | 4450 2012-04-01 | -20000 | 0 2012-05-01 | 900 | 900 2012-06-01 | 3900 | 4800 2012-07-01 | -2600 | 2200 2012-08-01 | -2600 | 0 2012-09-01 | 2100 | 2100 2012-10-01 | -2400 | 0 2012-11-01 | 1100 | 1100 2012-12-01 | 1300 | 2400
这是“表定义”:
select t.* from ( select date'2012-01-01' as mm, 800 as a from dual union all select date'2012-02-01' as mm, 1900 as a from dual union all select date'2012-03-01' as mm, 1750 as a from dual union all select date'2012-04-01' as mm, -20000 as a from dual union all select date'2012-05-01' as mm, 900 as a from dual union all select date'2012-06-01' as mm, 3900 as a from dual union all select date'2012-07-01' as mm, -2600 as a from dual union all select date'2012-08-01' as mm, -2600 as a from dual union all select date'2012-09-01' as mm, 2100 as a from dual union all select date'2012-10-01' as mm, -2400 as a from dual union all select date'2012-11-01' as mm, 1100 as a from dual union all select date'2012-12-01' as mm, 1300 as a from dual ) t;
因此,让我们释放这个问题的MODEL子句(仅能解决其神秘性的设备):
MODEL
with data as ( select date'2012-01-01' as mm, 800 as a from dual union all select date'2012-02-01' as mm, 1900 as a from dual union all select date'2012-03-01' as mm, 1750 as a from dual union all select date'2012-04-01' as mm, -20000 as a from dual union all select date'2012-05-01' as mm, 900 as a from dual union all select date'2012-06-01' as mm, 3900 as a from dual union all select date'2012-07-01' as mm, -2600 as a from dual union all select date'2012-08-01' as mm, -2600 as a from dual union all select date'2012-09-01' as mm, 2100 as a from dual union all select date'2012-10-01' as mm, -2400 as a from dual union all select date'2012-11-01' as mm, 1100 as a from dual union all select date'2012-12-01' as mm, 1300 as a from dual ) select mm, a, b from ( -- Add a dummy value for b, making it available to the MODEL clause select mm, a, 0 b from data ) -- Generate a ROW_NUMBER() dimension, in order to access rows by RN model dimension by (row_number() over (order by mm) rn) -- Spreadsheet values / measures involved in calculations are mm, a, b measures (mm, a, b) -- A single rule will do. Any value of B should be calculated according to -- GREATEST([previous value of B] + [current value of A], 0) rules ( b[any] = greatest(nvl(b[cv(rn) - 1], 0) + a[cv(rn)], 0) )
以上收益:
MM A B 01.01.2012 800 800 01.02.2012 1900 2700 01.03.2012 1750 4450 01.04.2012 -20000 0 01.05.2012 900 900 01.06.2012 3900 4800 01.07.2012 -2600 2200 01.08.2012 -2600 0 01.09.2012 2100 2100 01.10.2012 -2400 0 01.11.2012 1100 1100 01.12.2012 1300 2400