Попробуйте следующий запрос. По сути, вам нужно получить следующее значение STATE. Columndisplay текущей строки, если предыдущее состояние отличается от текущего.
create table state_data(
id number,
state varchar2(20),
ref varchar2(1),
date1 date);
insert into state_data values (1 ,'state_1','x',to_date('2010-12-01','YYYY-MM-DD'));
insert into state_data values (2 ,'state_1','x',to_date('2010-12-02','YYYY-MM-DD'));
insert into state_data values (3 ,'state_2','x',to_date('2010-12-02','YYYY-MM-DD'));
insert into state_data values (4 ,'state_2','x',to_date('2010-12-02','YYYY-MM-DD'));
insert into state_data values (5 ,'state_1','Y',to_date('2010-12-03','YYYY-MM-DD'));
insert into state_data values (6 ,'state_3','x',to_date('2010-12-03','YYYY-MM-DD'));
insert into state_data values (7 ,'state_4','x',to_date('2010-12-03','YYYY-MM-DD'));
insert into state_data values (8 ,'state_2','x',to_date('2010-12-03','YYYY-MM-DD'));
insert into state_data values (9 ,'state_1','x',to_date('2010-12-03','YYYY-MM-DD'));
insert into state_data values (10 ,'state_1','x',to_date('2010-12-04','YYYY-MM-DD'));
insert into state_data values (11 ,'state_2','x',to_date('2010-12-04','YYYY-MM-DD'));
commit;
- а затем запрос.
select id, state, ref, date1 from (
select id, state, ref, date1,
lag(state) over (order by id asc) prev_state
from state_data
)
where nvl(prev_state,'NULL') != nvl(state,'NULL');
ID STATE R DATE1
---------- -------------------- - ---------
1 state_1 x 01-DEC-10
3 state_2 x 02-DEC-10
5 state_1 Y 03-DEC-10
6 state_3 x 03-DEC-10
7 state_4 x 03-DEC-10
8 state_2 x 03-DEC-10
9 state_1 x 03-DEC-10
11 state_2 x 04-DEC-10
Приведенный выше результат имеет дополнительные строки, чем показано в выводе,
но, глядя на ваши данные, кажется, что это правильный результат.