что-то вроде этого должно привести вас туда.
Ниже я использовал 2 CTE, чтобы разделить данные о включении и выключении, а затем обеспечить ранжирование для первого включения при первом выключении, затем я использовалзапрос на объединение, чтобы сопоставить их с
declare @Events table (
ActionTaken nvarchar(25),
ID int
);
insert @Events
values
--ActionTaken ID ID_of_next_OFF
('Switched ON' , 1), -- 3
('Switched ON' , 2),-- 6
('Switched OFF', 3),
('Switched ON' , 4),-- 7
('Switched ON' , 5),-- 8
('Switched OFF', 6),
('Switched OFF', 7),
('Switched OFF', 8),
('Switched On' , 9),-- 10
('Switched OFF', 10),
('Switched On' , 11),-- 12
('Switched OFF', 12);
with onrank as (
select row_number()over(order by id) ranking, * from @Events where ActionTaken like '%ON')
, offrank as (
select row_number()over(order by id) ranking, * from @Events where ActionTaken like '%OFF')
select o.ActionTaken, o.ID, case when o.ranking=f.ranking then cast(f.id as nvarchar(3)) end as Id_next_off
from onrank o inner join offrank f on o.ranking=f.ranking
union
select ActionTaken, ID, '' from offrank
order by o.ID;