Ini memberi Anda hasil yang sama yang Anda minta, dalam format yang sedikit berbeda (tetapi Anda dapat dengan mudah menemukan PIVOT
solusi jika Anda membutuhkan kumpulan hasil yang sama persis):
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
Hasil:
ItemId State
----------- ------------------- -----------
1 Active 5
1 New 4
2 Active 3
2 New 3
Perhatikan bahwa saya mengabaikan PreviousState
kolom dari pertanyaan Anda dan saya malah membangun Joined
karena yang terpenting adalah kapan berikutnya negara mulai berlaku.
Masalah tidak ditangani karena Anda belum menjelaskannya dalam pertanyaan Anda:1) Apa yang harus dilakukan jika status akhir saat ini tidak Closed
- apakah kita mengabaikannya, atau menghitung sampai hari ini?, dan 2) Apa yang harus dilakukan jika waktu untuk setiap DateChanged
tidak sama - apakah kita harus menangani sebagian hari?