Dit geeft u dezelfde resultaten waar u om vraagt, in een iets ander formaat (maar u kunt PIVOT
gemakkelijk vinden oplossingen als u exact dezelfde resultatenset nodig heeft):
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
Resultaat:
ItemId State
----------- ------------------- -----------
1 Active 5
1 New 4
2 Active 3
2 New 3
Merk op dat ik de PreviousState
. negeer kolom van uw vraag en in plaats daarvan bouw ik Joined
want wat er echt toe doet is wanneer de volgende staat in werking getreden.
Problemen die niet zijn opgelost omdat u ze niet in uw vraag hebt beschreven:1) Wat te doen als de huidige eindstatus niet Closed
is - d.w.z. negeren we dat, of tellen we tot vandaag?, en 2) Wat te doen als de tijd van de dag voor elke DateChanged
is niet hetzelfde - hebben we te maken met gedeeltelijke dagen?