--#3: Running total of value changes
select id, a, b
,sum(has_changed) over (partition by A order by id
rows between unbounded preceding and current row) c
from
(
--#2: Find rows where the value changed.
select id, a, b
,case
when b = lag(b) over (partition by A order by id) then 0
else 1
end has_changed
from
(
--#1: Test data
select '01' ID, 'T' A, 1 B from dual union all
select '02' ID, 'T' A, 1 B from dual union all
select '03' ID, 'T' A, 0 B from dual union all
select '04' ID, 'T' A, 0 B from dual union all
select '05' ID, 'T' A, 1 B from dual union all
select '06' ID, 'T' A, 1 B from dual union all
select '07' ID, 'T' A, 1 B from dual union all
select '08' ID, 'T' A, 0 B from dual union all
select '09' ID, 'T' A, 1 B from dual union all
select '10' ID, 'T' A, 1 B from dual union all
select '11' ID, 'T' A, 0 B from dual
) test_data
)
order by id;
结果:
ID A B C
01 T 1 1
02 T 1 1
03 T 0 2
04 T 0 2
05 T 1 3
06 T 1 3
07 T 1 3
08 T 0 4
09 T 1 5
10 T 1 5
11 T 0 6
不完全相同,尽管我认为您的示例有额外的增量,正如@Adam Hawkes 指出的那样。
更新
这将产生您预期的结果:
--#3: Running total of value changes, or where the value is 0
select id, a, b
,sum(has_changed_or_0) over (partition by A order by id
rows between unbounded preceding and current row) c
from
(
--#2: Find rows where the value changed, or where value is 0
select id, a, b
,case
when b = 0 then 1
when b = lag(b) over (partition by A order by id) then 0
else 1
end has_changed_or_0
from
(
--#1: Test data
select '01' ID, 'T' A, 1 B from dual union all
select '02' ID, 'T' A, 1 B from dual union all
select '03' ID, 'T' A, 0 B from dual union all
select '04' ID, 'T' A, 0 B from dual union all
select '05' ID, 'T' A, 1 B from dual union all
select '06' ID, 'T' A, 1 B from dual union all
select '07' ID, 'T' A, 1 B from dual union all
select '08' ID, 'T' A, 0 B from dual union all
select '09' ID, 'T' A, 1 B from dual union all
select '10' ID, 'T' A, 1 B from dual union all
select '11' ID, 'T' A, 0 B from dual
) test_data
)
order by id;