यह आपको वही परिणाम देता है जो आप मांग रहे हैं, थोड़े अलग प्रारूप में (लेकिन आप आसानी से 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
के लिए दिन का समय हो तो क्या करें? वही नहीं है - क्या हमें आंशिक दिनों को संभालना है?