Первый ответ - но смотрите окончательный вариант ниже с дополнительными ограничениями, добавленными OP.
- Если вы хотите получить следующий startTime после самого последнего endTime и избежать перекрытий, вам нужно что-то вроде:
select
distinct
e1.deviceId,
e1.EventEnd,
e3.EventStart
from Events e1
join Events e3 on e1.eventEnd < e3.eventStart /* Finds the next start Time */
and e3.eventStart = (select min(eventStart) from Events e5
where e5.eventStart > e1.eventEnd)
and not exists (select * /* Eliminates an e1 rows if it is overlapped */
from Events e5
where e5.eventStart < e1.eventEnd
and e5.eventEnd > e1.eventEnd)
Для случая трех строк:
INSERT INTO Events VALUES (1, '01/01/2012 08:00', '01/01/2012 10:00')
INSERT INTO Events VALUES (2, '01/01/2012 18:00', '01/01/2012 20:00')
insert into Events values (2, '01/01/2012 09:00', '01/01/2012 11:00')
Это дает 1 результат:
January, 01 2012 11:00:00-0800 January, 01 2012 18:00:00-0800
Тем не менее, я предполагаю, что вы, вероятно, хотите найти совпадения и на DeviceId.В этом случае в объединениях вы добавите e1.DeviceId = e3.DeviceId
и e1.deviceId = e5.deviceId
SQL Fiddle здесь: http://sqlfiddle.com/#!3/3899c/8
-
OK, окончательное редактирование,Вот запрос на добавление deviceIds и добавление в отдельную учетную запись для одновременного завершения событий:
SELECT distinct
e1.DeviceID,
e1.EventEnd as LastEndTime,
e3.EventStart as NextStartTime
FROM Events e1
join Events e3 on e1.eventEnd < e3.eventStart
and e3.deviceId = e1.deviceId
and e3.eventStart = (select min(eventStart) from Events e5
where e5.eventStart > e1.eventEnd
and e5.deviceId = e3.deviceId)
where not exists (select * from Events e7
where e7.eventStart < e1.eventEnd
and e7.eventEnd > e1.eventEnd
and e7.deviceId = e1.deviceId)
order by e1.deviceId, e1.eventEnd
Соединение с e3 находит следующий запуск.Присоединение к e5 гарантирует, что это самое раннее время начала после текущего времени окончания.Соединение с e7 исключает строку, если время окончания рассматриваемой строки перекрывается другой строкой.
Для этих данных:
INSERT INTO Events VALUES (1, '01/01/2012 08:00', '01/01/2012 10:00')
INSERT INTO Events VALUES (2, '01/01/2012 18:00', '01/01/2012 20:00')
insert into Events values (2, '01/01/2012 09:00', '01/01/2012 11:00')
insert into Events values (2, '01/02/2012 11:00', '01/02/2012 15:00')
insert into Events values (1, '01/02/2012 10:00', '01/02/2012 12:00')
insert into Events values (2, '01/02/2012 10:00', '01/02/2012 15:00')
insert into Events values (2, '01/03/2012 09:00', '01/03/2012 10:00')
Вы получите такой результат:
1 January, 01 2012 10:00:00-0800 January, 02 2012 10:00:00-0800
2 January, 01 2012 11:00:00-0800 January, 01 2012 18:00:00-0800
2 January, 01 2012 20:00:00-0800 January, 02 2012 10:00:00-0800
2 January, 02 2012 15:00:00-0800 January, 03 2012 09:00:00-0800
Скрипка SQL здесь: http://sqlfiddle.com/#!3/db0fa/3