I have a single table of on/off events for different assets. I need to get a list of start & stop event times without using a cursor.
Source:
Item
declare @YourTable table (Item varchar(10), EventDate datetime, Event varchar(10))
insert into @YourTable values
('A','2011-10-03 00:01:00''On'),
('B','2011-10-03 00:01:00','On'),
('A','2011-10-03 00:02:00','Off'),
('C','2011-10-03 00:01:00','On'),
('B','2011-10-03 00:02:00','Off'),
('A','2011-10-03 00:02:02','On'),
('C','2011-10-03 00:02:05','Off'),
('A','2011-10-03 00:02:07','Off'),
('D','2011-10-03 00:02:02','On')
;with a as
(
select item, eventdate, event, ROW_NUMBER() Over(Partition by Item order by EventDate) RN
from @YourTable
),
b as (
select item, eventdate, 0 e, rn, event from a where rn = 1
union all
select b.item, a.eventdate, case when b.event = 'Off' then b.e+1 else b.e end, a.rn, a.event
from b
join a on b.rn + 1 = a.rn and a.item = b.item
)
select item, min(eventdate) Start, max(eventdate) [End]
from b
group by item, e
order by item, e