--#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
하지 같은, 내가 @ 아담 호크스가 지적한대로 예, 여분의 증가가 있다고 생각하지만.
UPDATE 이것은 예상되는 결과를 생성
: 예상 출력
--#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;
, ID와 행 = 4 열 C.의 증분 값은 정확한 것이되어왔다 ? –