次のクエリを試してください。基本的には、前の状態が現在の行と異なる場合は、次の値のSTATE Columndが現在の行を表示する必要があります。
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
上記の結果は、あなたが出力に示されたものよりも追加の行を持っている が、これは正しい結果であるように、あなたのデータを見て、それはそうです。
Rajeshの回答は近いですが、それにはID 8も含まれています。しかし、ID 8が結果に含まれているようです。 –
あなたは正しい - Rajeshの答えは論理(と素晴らしい)のようだ。 ID 8は私の部分にタイプミスです - 謝罪 - しかし、Rajeshの質問はそれを捕らえるべきです。私はそれを希望の結果のリストに追加しています。私はすぐに答えをテストします。 – tamersalama
私は結果とスクリプトを含むように投稿を編集しました。 –