Это звучит как проблема пропусков и островков.
Вы можете создать ранг в зависимости от типа события.
Затем сгруппировать его по этому рангу и рассчитать общее расстояние от него.
Пример фрагмента:
-- Using a table variable for testing purposes
declare @Table table (EventDate datetime, EventName varchar(30), Distance decimal(9,2));
-- Sample data
insert into @Table (EventName, EventDate, Distance) values
('All Clear','2018-09-06 01:54',0)
,('Passing 3 Nmz','2018-09-06 02:35',0)
,('Commence Sea Passage','2018-09-06 03:00',10)
,('Commence Sea Passage','2018-09-06 03:00',0)
,('DailyReport','2018-09-06 12:00',119)
,('End Of Sea Passage','2018-09-07 05:45',335)
,('Pilot Embarked','2018-09-07 06:00',0)
,('Tug Fast','2018-09-07 07:40',0)
,('Mooring Commenced','2018-09-07 08:15',0)
,('All Fast','2018-09-07 08:45',19)
,('Pilot Embarked','2018-09-07 23:18',0)
,('Unmooring Commenced','2018-09-07 23:45',0)
,('All Clear','2018-09-08 00:00',0.01)
,('Pilot Disembarked','2018-09-08 01:30',0)
,('Commence Sea Passage','2018-09-08 01:40',17)
,('Voyage Complete','2018-09-08 01:40',0)
,('Voyage Commenced','2018-09-08 01:45',0)
,('End Of Sea Passage','2018-09-08 10:00',83)
,('Anchored','2018-09-08 11:00',3.2)
,('DailyReport','2018-09-08 12:00',0)
,('All Fast','2018-09-09 20:00',40)
;
-- Query
;with CTE as
(
select EventDate, Distance, EventName
, iif(EventName = 'All Clear',1,0) as isMainEvent
from @Table
)
select
min(EventDate) as MinDateTime,
max(EventDate) as MaxDateTime,
sum(Distance) as TotalDistance
from
(
select *
, row_number() over (order by EventDate) - row_number() over (partition by isMainEvent order by EventDate) as rnk
from CTE
) q
where isMainEvent = 0
group by rnk
order by rnk;
Выход:
MinDateTime MaxDateTime TotalDistance
------------------- ------------------- -------------
2018-09-06 02:35:00 2018-09-07 23:45:00 483.00
2018-09-08 01:30:00 2018-09-09 20:00:00 143.20