Това ви дава същите резултати, които искате, в малко по-различен формат (но можете лесно да намерите PIVOT
решения, ако имате нужда от абсолютно същия набор от резултати):
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
Резултат:
ItemId State
----------- ------------------- -----------
1 Active 5
1 New 4
2 Active 3
2 New 3
Имайте предвид, че пренебрегвам PreviousState
колона от вашия въпрос и вместо това изграждам Joined
защото това, което наистина има значение, е кога следната състояние влезе в сила.
Проблеми, които не са разгледани, защото не сте ги описали във вашия въпрос:1) Какво да направите, ако текущото крайно състояние не е Closed
- т.е. пренебрегваме ли това или броим до днес? и 2) Какво да правим, ако времето от деня за всяка DateChanged
не е същото - трябва ли да обработваме частични дни?