Вот решение: вы присоединяете свою таблицу к себе и используете оконную функцию для возврата следующего соответствующего события остановки для каждого события запуска
Запрос возвращает все события, которые начались 1 января, и их соответствующую остановку. события (событие останова имеет тот же тип машины и действия)
NB - я думаю, что 2-я строка в вашем ожидаемом выводе является ошибочной, так как нет события останова для устройства 2, типа 2 (оно также похоже на этоимеет опечатку - должно 1.1.2019 00:00:00
быть 1.1.2019 00:10:00
?)
CREATE TABLE StartTimes
(
[Date] DATETIME,
Machine VARCHAR(7),
Activity_Type VARCHAR(5),
[Status] VARCHAR(5)
)
INSERT INTO StartTimes VALUES
('12/31/2018 23:15:00','device2','type2','Start'),
('1/1/2019 00:05:00','device1','type1','Start'),
('1/1/2019 00:10:00','device2','type2','Stop'),
('1/1/2019 00:15:00','device2','type1','Start'),
('1/1/2019 00:20:00','device1','type1','Stop'),
('1/1/2019 00:25:00','device1','type3','Start'),
('1/2/2019 00:23:00','device1','type3','Stop'),
('1/3/2019 00:00:00','device2','type1','Stop')
SELECT StartDate,
EndDate,
CONVERT(varchar(12), DATEADD(MINUTE,DATEDIFF(MINUTE,StartDate,EndDate),0),114) AS Duration,
Activity_Type,
Machine
FROM (
SELECT s.[Date] AS StartDate,
s.Machine,
s.Activity_Type,
s.[Status],
s1.[Date] AS EndDate,
ROW_NUMBER() OVER (PARTITION BY s.date ORDER BY s1.Date) as RowN
FROM StartTimes s
JOIN StartTimes s1
ON s.[Date] < s1.[Date] AND
s.Machine = s1.Machine AND
s.Activity_Type = s1.Activity_Type AND
s.Status = 'Start' AND
s1.Status = 'Stop'
) a
WHERE RowN= 1 AND
[StartDate] >= '2019-01-01' AND
[StartDate] < '2019-01-02'
ORDER BY StartDate