sql自我加入以前的记录以进行审计更改

时间:2015-04-01 11:19:01

标签: 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,user,account,status,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
)

但这加入的不仅仅是前一个

1 个答案:

答案 0 :(得分: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相同的方式对记录进行排序。你的逻辑混合了两者 - 我认为最好只坚持一列来定义前一条记录。