Dadurch erhalten Sie dieselben Ergebnisse, nach denen Sie gefragt haben, in einem etwas anderen Format (aber Sie können PIVOT leicht finden Lösungen, wenn Sie genau die gleiche Ergebnismenge benötigen):
declare @t table (ItemId int,Revision int,State varchar(19),DateChanged datetime2)
insert into @t(ItemId,Revision,State,DateChanged) values
(1,1,'New', '2014-11-13T10:00:00'),
(1,2,'Active','2014-11-15T10:00:00'),
(1,3,'New', '2014-11-17T10:00:00'),
(1,4,'Active','2014-11-19T10:00:00'),
(1,5,'Active','2014-11-20T10:00:00'),
(1,6,'Closed','2014-11-22T10:00:00'),
(2,1,'New', '2014-11-13T10:00:00'),
(2,2,'Active','2014-11-16T10:00:00'),
(2,3,'Closed','2014-11-17T10:00:00'),
(2,4,'Active','2014-11-19T10:00:00'),
(2,5,'Closed','2014-11-21T10:00:00')
;With Joined as (
select t1.ItemId,t1.State,DATEDIFF(day,t1.DateChanged,t2.DateChanged) as Days
from
@t t1
inner join
@t t2
on
t1.ItemId = t2.ItemId and
t1.Revision = t2.Revision -1
)
select ItemId,State,SUM(Days)
from Joined
where State <> 'Closed'
group by ItemId,State
Ergebnis:
ItemId State
----------- ------------------- -----------
1 Active 5
1 New 4
2 Active 3
2 New 3
Beachten Sie, dass ich den PreviousState ignoriere Spalte aus Ihrer Frage und konstruiere stattdessen Joined denn was wirklich zählt, ist wann die nächste Bundesstaat in Kraft getreten.
Probleme, die nicht behandelt wurden, weil Sie sie in Ihrer Frage nicht beschrieben haben:1) Was tun, wenn der aktuelle Endzustand nicht Closed ist? - d.h. ignorieren wir das oder zählen wir bis heute? und 2) Was tun, wenn sich die Tageszeit für jedes DateChanged ist nicht dasselbe - müssen wir Teiltage behandeln?