Я не уверен, что это можно решить, используя только «нормальный» SQL (без некоторых итеративных функций, таких как cursors ).
Если вы можете быть уверены, что каждая попытка начинается в полные минуты и длится менее 60 секунд, тогда этот простой подход может сработать:
select convert(smalldatetime, date_time),
min(RowA), min(RowB), min(RowD),
max(RowA), max(RowB), max(RowD)
from YourTableName
group by convert(smalldatetime, date_time)
Но это работает только потому, что smalldatetime удаляет часть секунд вашего поля date_time.
Кроме того, в моем примере я предполагаю, что RowA, B и D содержат некоторые значения, которые являются прогрессивными, что я считаю моим неверным предположением.
Возможно, вам придется написать здесь несколько подзапросов:
Обновление
В этом запросе должны быть перечислены все попытки запуска:
select t1.*
from <YourTableName> t1
where not exists(
select *
from <YourTableName> t2
where t2.date_time >= dateadd(s, -5, t1.date_time)
and t2.date_time < t1.date_time
)
Результат для данных в вашем примере:
RowA RowB date_time RowD
------- ------- ----------------------- -------
ValueA1 ValueB1 2001-01-01 16:23:01.000 ValueD1
ValueA4 ValueB4 2001-03-01 12:23:01.000 ValueD4
ValueA5 ValueB5 2001-03-01 16:23:06.000 ValueD5
Я не знаю, нужен ли вам также последний ряд каждой попытки в строках вашей сетки (в той же строке). Это усложнит ситуацию.
Обновление 2:
Если вы используете SQL Server 2005 (или новее), вы можете использовать общие табличные выражения, например, этот запрос, который дает начальную и конечную строку в одну строку:
with start_rows as (
select start.*
from <YourTablenName> start
where not exists(
select *
from <YourTableName> start2
where start2.date_time >= dateadd(s, -5, start.date_time)
and start2.date_time < start.date_time
)
),
stop_rows as (
select stop.*
from <YourTablenName> stop
where not exists(
select *
from <YourTableName> stop2
where stop2.date_time <= dateadd(s, 5, stop.date_time)
and stop2.date_time > stop.date_time
)
)
select start_rows.*, stop_rows.*
from start_rows, stop_rows
where start_rows.date_time <= stop_rows.date_time
and not exists(
select * from stop_rows sr2
where sr2.date_time < stop_rows.date_time
and sr2.date_time >= start_rows.date_time
)
order by start_rows.date_time
Результат в этом случае:
ValueA1 ValueB1 2001-01-01 16:23:01.000 ValueD1 ValueA3 ValueB3 2001-01-01 16:23:11.000 ValueD3
ValueA4 ValueB4 2001-03-01 12:23:01.000 ValueD4 ValueA4 ValueB4 2001-03-01 12:23:01.000 ValueD4
ValueA5 ValueB5 2001-03-01 16:23:06.000 ValueD5 ValueA7 ValueB7 2001-03-01 16:23:16.000 ValueD7