只从审计日志表中选择一个值的更改

问题描述:

在MS SQL Server 2008 R2中,我有一个表Foo,并且对于Foo上的每个插入和更新,我还将FooAuditLog插入日期,用户,PK FooId和Foo的其他一些列(包括一个数值)称之为cxp。只从审计日志表中选择一个值的更改

我现在需要检索给定FooId随时间变化的cxp更改历史记录。但是可以在不改变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

您使用的是什么RDBMS? – Taryn 2013-02-08 18:57:10

+0

忽视“11/7,11/9和11/14”背后的逻辑是什么? – Kaf 2013-02-08 19:07:05

+0

@Kaf:我只想选择所需值(cxp)发生变化的日志条目。在提到的日期中,cxp与上次保存时的相同。 – cobaltduck 2013-02-08 19:33:32

您需要获取以前的值。这个版本使用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更换。