Идея этого решения состоит в том, чтобы упорядочить ваши строки на BeginDate
для каждого VoyageID
.Пройдите сверху и выберите строки, которые имеют разницу во времени более 7 секунд, к предыдущей строке.
@Voy
вместо hist.VoyageProfitLossValues
.Сначала я создаю временную таблицу #T
, которая заполнит столбец ID
упорядоченными значениями для каждого VoyageID
.C
- это рекурсивный CTE, который начинается с ID = 1
и проходит через все строки, сравнивая текущую строку с предыдущей строкой и сохраняя результат в столбце FirstDate
.Я добавил второй VoyageID
к образцу данных, чтобы убедиться, что он также работает с этим.
declare @Voy table
(
BeginDate datetime,
EndDate datetime,
VoyageID int
)
insert into @Voy values
('2011-07-05 07:02:50.713', '2011-07-05 07:25:53.007', 6312),
('2011-07-05 07:02:50.870', '2011-07-05 07:25:53.693', 6312),
('2011-07-05 07:02:51.027', '2011-07-05 07:25:54.387', 6312),
('2011-07-08 14:22:21.147', NULL , 6312),
('2011-07-08 14:22:21.163', NULL , 6312),
('2011-07-08 14:22:21.177', NULL , 6312),
('2011-07-05 07:02:50.713', '2011-07-05 07:25:53.007', 6313),
('2011-07-05 07:02:50.870', '2011-07-05 07:25:53.693', 6313),
('2011-07-05 07:02:51.027', '2011-07-05 07:25:54.387', 6313),
('2011-07-08 14:22:21.147', NULL , 6313),
('2011-07-08 14:22:21.163', NULL , 6313),
('2011-07-08 14:22:21.177', NULL , 6313)
create table #T
(
ID int,
VoyageID int,
BeginDate datetime
primary key (ID, VoyageID)
)
insert into #T (ID, VoyageID, BeginDate)
select row_number() over(partition by VoyageID order by BeginDate),
VoyageID,
BeginDate
from @Voy
;with C as
(
select T.ID,
T.VoyageID,
T.BeginDate,
1 as FirstDate
from #T as T
where T.ID = 1
union all
select T.ID,
T.VoyageID,
T.BeginDate,
case when datediff(second, C.BeginDate, T.BeginDate) > 7 then 1 else 0 end
from #T as T
inner join C
on T.ID = C.ID + 1 and
T.VoyageID = C.VoyageID
)
select C.BeginDate,
C.VoyageID
from C
where C.FirstDate = 1
order by C.VoyageID,
C.BeginDate
option (maxrecursion 0)
drop table #T
Результат:
BeginDate VoyageID
----------------------- -----------
2011-07-05 07:02:50.713 6312
2011-07-08 14:22:21.147 6312
2011-07-05 07:02:50.713 6313
2011-07-08 14:22:21.147 6313