Điều này mang lại cho bạn kết quả giống như bạn đang yêu cầu, ở một định dạng hơi khác (nhưng bạn có thể dễ dàng tìm thấy PIVOT
giải pháp nếu bạn cần cùng một bộ kết quả):
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
Kết quả:
ItemId State
----------- ------------------- -----------
1 Active 5
1 New 4
2 Active 3
2 New 3
Lưu ý rằng tôi đang bỏ qua PreviousState
từ câu hỏi của bạn và thay vào đó tôi đang xây dựng Joined
bởi vì điều thực sự quan trọng là khi nào tiếp theo trạng thái có hiệu lực.
Các vấn đề không được xử lý vì bạn chưa mô tả chúng trong câu hỏi của mình:1) Phải làm gì nếu trạng thái cuối cùng hiện tại không Closed
- tức là chúng ta bỏ qua điều đó hay tính cho đến ngày hôm nay? và 2) Phải làm gì nếu thời gian trong ngày cho mỗi DateChanged
không giống nhau - chúng ta có phải xử lý từng ngày không?