Для начала рассмотрим следующий запрос, который создает отсутствующую запись.
select
StopTime StartTime,
NextStartTime StopTime,
datediff(minute, StopTime, NextStartTime) DurationMin
from (
select StopTime, lead(StartTime) over(order by StartTime) NextStartTime
from mytable
) t
where StopTime < NextStartTime
Подзапрос извлекает время следующего запуска каждой записи, используя оконную функцию lead()
; затем для каждой записи, за которой следует пробел, внешний запрос генерирует запись, которая заполняет ее.
Затем можно использовать union all
, чтобы привести вашу таблицу, с предложением order by
для представления:
(
select coil, StartTime, StopTime, DurationMin from mytable
union all
select
null,
StopTime,
NextStartTime,
datediff(minute, StopTime, NextStartTime) DurationMin
from (
select StopTime, lead(StartTime) over(order by StartTime) NextStartTime
from mytable
) t
where StopTime < NextStartTime
)
order by StartTime
Демонстрация DB Fiddle с вашими данными выборки :
coil | StartTime | StopTime | DurationMin
:-------- | :---------------------- | :---------------------- | ----------:
27020-100 | 2019-09-27 10:05:00.000 | 2019-09-27 18:30:00.000 | 36
<em>null</em> | 2019-09-27 18:30:00.000 | 2019-09-27 20:06:00.000 | 96
27020-100 | 2019-09-27 20:06:00.000 | 2019-09-27 20:41:00.000 | 36