2015-04-01 73 views
1

我試圖獲得一個SQL查詢與之前時間的狀態返回行有一個審計日誌是同一個帳戶SQL自聯接審計變化

create table aud 
(
id int IDENTITY(1,1), 
date_time datetime, 
[user] varchar(20), 
account varchar(20), 
[status] char(2) 
) 
insert into aud values(getdate(),'guy','123456','00') 
insert into aud values(getdate(),'guy','123456','01') 
insert into aud values(getdate(),'guy','123456','02') 
insert into aud values(getdate(),'guy','123456','00') 
insert into aud values(getdate(),'guy','123456','04') 
insert into aud values(getdate(),'guy','123456','01') 

什麼我期待的是,列出了以前的帳戶狀態類似 DATE_TIME,用戶帳號,狀態,因此PREVIOUS_STATUS

我試圖

select a.*, b.* from aud a 
join aud b 
on a.account = (
select top 1 account from aud where a.account = b.account and a.id > b.id order by date_time asc 
) 

但這加入不僅僅是以前的一個

+2

猜測這是SQL Server?請在版本中添加適當的標籤。 – 2015-04-01 11:20:38

+0

可能重複[如何以每個記錄與「上一個」記錄連接的方式自聯接表?](http://stackoverflow.com/questions/15527423/how-to-self-join-table-在這種方式中,每一條記錄都是與之前相連的) – gvee 2015-04-01 11:21:11

回答

1

如果您正在使用SQL Server 2012+,你可以使用lag()單個列。在你的情況下,你希望所有列,以便outer apply更好:

select a.*, aprev.* 
from aud a outer apply 
    (select top 1 a2.* 
     from aud a2 
     where a2.account = a.account and a2.id < a.id 
     order by id desc 
    ) aprev; 

這假定id訂購的記錄方式date_time相同。你的邏輯將兩者混合在一起 - 我認爲最好只用一列來定義以前的記錄。

+0

謝謝,那正是我想要做的事,爲了利益的緣故, – user2168435 2015-04-01 11:44:24