Запрос Oracle, возвращающий записи об изменении последовательности значений поля - PullRequest
0 голосов
/ 07 декабря 2010

Учитывая следующий набор записей, я бы хотел вернуть первое вхождение «измененной» записи.

Дано (соответствующие поля):


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

Желаемый возврат (для объекта ref X):


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

Дальнейшее объяснение: Этотаблица аудита, которая хранит состояние объектов, и я хотел бы отследить даты, когда произошло изменение состояния определенного объекта.

Я играю с агрегатами / аналитикой, но начинаю задаваться вопросом, не являются ли онидоставит меня куда угодно.

1 Ответ

2 голосов
/ 07 декабря 2010

Попробуйте следующий запрос. По сути, вам нужно получить следующее значение 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

Приведенный выше результат имеет дополнительные строки, чем показано в выводе, но, глядя на ваши данные, кажется, что это правильный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...