У меня есть таблица с отметкой времени сэмплов:
create table #OREN_TEMP(TS datetime)
insert into #OREN_TEMP(TS)
values
('2019-10-25 06:20:07.000'),
('2019-10-25 06:20:15.000'),
('2019-10-25 06:20:19.000'),
('2019-10-25 06:20:26.000'),
('2019-10-25 06:20:26.000'),
('2019-10-25 06:20:34.000'),
('2019-10-25 06:20:42.000'),
('2019-10-25 06:20:51.000'),
('2019-10-25 06:20:59.000'),
('2019-10-25 06:21:07.000'),
('2019-10-25 06:21:15.000'),
('2019-10-25 06:21:19.000'),
('2019-10-25 06:21:26.000')
select * from #OREN_TEMP
Меня попросили извлечь данные из таблицы, когда минимальное время между сэмплами составляет 20 секунд. Это означает, что мне нужно извлечь следующее:
('2019-10-25 06:20:07.000')
('2019-10-25 06:20:34.000')
('2019-10-25 06:20:59.000')
('2019-10-25 06:21:19.000')
Я попытался сделать следующее:
declare @MIN_DATE datetime
select top 1 @MIN_DATE =TS from #OREN_TEMP
order by TS
select TS
from (select TS, row_number() over (partition by datediff(second,@MIN_DATE,TS) / 20 order by TS) as RowNum
from #OREN_TEMP
) TMP
where TMP.ROWNUM=1
и получил:
TS
2019-10-25 06:20:07.000
2019-10-25 06:20:34.000
2019-10-25 06:20:51.000 -- Not good - only 17 seconds from previous
2019-10-25 06:21:07.000 -- Not good - only 16 seconds from previous
, но это не такЭто не помогло, поскольку я разделил временные рамки на основе первого TS, а не последнего.
Я хочу избегать циклов и курсора. Внутреннее соединение с самой таблицей в порядке.
Как мне это сделать? Я использую стандартную версию SQL Server 2012.