2013-02-08 79 views
0

在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

回答

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更換。

相關問題