2016-08-24 4 views
1

単一のテーブルで複数のエントリを比較する最も洗練された方法を探しています。監査データを保持するテーブルがありますが、現在の値が何であるかだけを示しています。この同じオブジェクトのエントリを見て、それが違うかどうかを調べたいと思います。テーブルスキーマの例を次に示します。SQL - 行の変更を最新のエントリと前のエントリと比較する

ObjectID   Value   Timestamp 
a     granted   08/24/2016 17:56:59 
b     unset   08/24/2016 12:17:59 
b     unset   08/24/2016 11:17:45 
a     unset   08/23/2016 07:56:59 
a     deny    08/23/2016 20:12:59 
b     deny    08/22/2016 05:45:59 

最新のa、bが以前のa、bと異なる場合は、bを探しています。上記の例では、最初のaがunset-> grantedから変更され、最後のbがdeny-> unsetから変更されています。

私はサブクエリを実行し、最新の前に行を選択して値を比較する必要があると思っています。良い方法があるかもしれないと思った。

+1

を助けることができます。 –

+0

あなたのコードはどこですか?これまでに何を試しましたか? – Marusyk

+0

まず、row_numberとself-joiningを持つCTEを使用して、このような多くの問題をエレガントに実行できることがわかりました。 – SMM

答えて

0

おそらくこれは、あなたが期待する結果をクエリがあることだと思うし、最も重要なものを追加する必要があります

Declare @Table table (ObjectID varchar(25), Value varchar(25), Timestamp Datetime) 
Insert into @Table values 
('a','granted','08/24/2016 17:56:59'), 
('b','unset','08/24/2016 12:17:59'), 
('b','unset','08/24/2016 11:17:45'), 
('a','unset','08/23/2016 07:56:59'), 
('a','deny','08/23/2016 20:12:59'), 
('b','deny','08/22/2016 05:45:59') 

Declare @XML xml 
Set @XML = (Select * from @Table for XML RAW) 

;with cteBase as (
    Select ObjectID  = r.value('@ObjectID','varchar(25)') 
      ,Timestamp = r.value('@Timestamp','datetime') 
      ,Item   = Attr.value('local-name(.)','varchar(max)') 
      ,Value  = Attr.value('.','varchar(max)') 
    From @XML.nodes('/row') AS A(r) 
    Cross Apply A.r.nodes('./@*[local-name(.)!="ObjectID"]') AS B(Attr) 
) 
,cteExt as (Select *,LastValue =Lag(Value) over (Partition By ObjectID,Item Order by Timestamp) From cteBase) 
Select ObjectID 
     ,Item 
     ,Before=LastValue 
     ,After =Value 
     ,Timestamp 
From cteExt 
Where Value<>LastValue and LastValue is not null 
    and Item not in ('Timestamp') 
Order By ObjectID,Timestamp 

戻り

ObjectID Item Before After Timestamp 
a   Value unset deny 2016-08-23 20:12:59.000 
a   Value deny granted 2016-08-24 17:56:59.000 
b   Value deny unset 2016-08-24 11:17:45.000 
関連する問題