只从审计日志表中选择一个值的更改
问题描述:
在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
,但我确实需要捕获值变回以前值的条目。
答
您需要获取以前的值。这个版本使用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
更换。
您使用的是什么RDBMS? – Taryn 2013-02-08 18:57:10
忽视“11/7,11/9和11/14”背后的逻辑是什么? – Kaf 2013-02-08 19:07:05
@Kaf:我只想选择所需值(cxp)发生变化的日志条目。在提到的日期中,cxp与上次保存时的相同。 – cobaltduck 2013-02-08 19:33:32