2010-12-07 7 views
0

次のレコードがあると、最初に「変更された」レコードが戻されます。フィールド値のシーケンスの変更のレコードを戻すOracleクエリー

与えられる(関連分野):(オブジェクトのREF X用)


ID STATE REF  DATE 
1  state_1 x  2010-12-01 
2  state_1 x  2010-12-02 
3  state_2 x  2010-12-02 
4  state_2 x  2010-12-02 
5  state_1 Y  2010-12-03 
6  state_3 x  2010-12-03 
7  state_4 x  2010-12-03 
8  state_2 x  2010-12-03 
9  state_1 x  2010-12-03 
10 state_1 x  2010-12-04 
11 state_2 x  2010-12-04 
 

理想リターン:


ID STATE REF  DATE 
1  state_1 x  2010-12-01 
3  state_2 x  2010-12-02 
6  state_3 x  2010-12-03 
7  state_4 x  2010-12-03 
8  state_2 x  2010-12-03 
9  state_1 x  2010-12-03 
11 state_2 x  2010-12-04 

さらに説明: これは、オブジェクトの状態を維持する監査テーブルであり、特定のオブジェクトの状態に変更が発生した日付を追跡したいと思います。

私は集計/アナリティクスで遊んでいますが、どこにいてもかまいません。

+0

Rajeshの回答は近いですが、それにはID 8も含まれています。しかし、ID 8が結果に含まれているようです。 –

+0

あなたは正しい - Rajeshの答えは論理(と素晴らしい)のようだ。 ID 8は私の部分にタイプミスです - 謝罪 - しかし、Rajeshの質問はそれを捕らえるべきです。私はそれを希望の結果のリストに追加しています。私はすぐに答えをテストします。 – tamersalama

+0

私は結果とスクリプトを含むように投稿を編集しました。 –

答えて

2

次のクエリを試してください。基本的には、前の状態が現在の行と異なる場合は、次の値の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 

上記の結果は、あなたが出力に示されたものよりも追加の行を持っている が、これは正しい結果であるように、あなたのデータを見て、それはそうです。

+0

Rajeshに時間を割いて答えていただきありがとうございました。あなたのソリューションは素晴らしい仕事をしました。私は 'X'または 'Y'条件を追加するだけでした。 – tamersalama

+0

あなたは大歓迎です:)...私は "x"の部分を見落としました..! –

関連する問題