おそらくこれは、あなたが期待する結果をクエリがあることだと思うし、最も重要なものを追加する必要があります
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
を助けることができます。 –
あなたのコードはどこですか?これまでに何を試しましたか? – Marusyk
まず、row_numberとself-joiningを持つCTEを使用して、このような多くの問題をエレガントに実行できることがわかりました。 – SMM