2013-02-08 4 views
0

В MS SQL Server 2008 R2 у меня есть таблица Foo, и для каждой вставки и обновления в Foo я также вставляю в FooAuditLog дату, пользователя, PK FooId и несколько других столбцов Foo, включая одно числовое значение, назовите его cxp.Выберите только изменения для значения из таблицы журнала аудита

Теперь мне нужно получить историю изменений в cxp с течением времени для данного FooId. Но можно сохранить Foo без изменения cxp, и мне нужно игнорировать эти значения.

Например, если записи журнала аудита для конкретного Foo (т.е. select date, user, cxp from FooAuditLog where fooId=17) выглядеть следующим образом:

Date  User  Cxp 
------------------------- 
10/26  Fred  42 
10/28  George 38 
11/7  Tom  38 
11/9  Fred  38 
11/12  Joe  33 
11/14  Tom  33 
11/18  George 38 

Тогда мне нужно изменить запрос, чтобы вернуться только:

Date  User  Cxp 
----------------------------- 
10/26  Fred  42 
10/28  George 38 
11/12  Joe  33 
11/18  George 38 

И игнорировать записи 11/7, 11/9 и 11/14. Я считал select distinct (cpx) ... group by date, но мне нужно записать запись, в которой значение возвращается к предыдущему значению.

+0

Какие СУБД вы используете? – Taryn

+0

Какова ваша логика, игнорируя «11/7, 11/9 и 11/14' ?. – Kaf

+0

@Kaf: Я хочу только выбрать записи журнала, в которых изменилось требуемое значение (cxp). В указанные даты cxp такой же, как и при последнем сохранении. – cobaltduck

ответ

1

Вам необходимо получить предыдущее значение. Эта версия использует синтаксис MySQL с коррелированными подзапросами, чтобы получить результат:

select t.* 
from (select t.*, 
      (select cxp from t t2 where t2.date < t.date order by date desc limit1 
      ) as prevcxp 
     from t 
    ) t 
where prevcxp is NULL or prevcxp <> cxp 

В других базах данных, вы можете использовать lag() вместо подзапроса, то limit может быть заменено top или даже fetch first 1 row.

Смежные вопросы