Выберите только изменения значения из таблицы журнала аудита

В 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 но мне нужно захватить запись, где значение возвращается к предыдущему значению.

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,

Другие вопросы по тегам