Я думаю, что следующий ниже запрос делает то, что вы хотите, но я не понимаю ваш ожидаемый результат. Он возвращает счет 4 (все строки в вашем примере), которые, как я считаю, будут правильными, потому что все ваши записи находятся на расстоянии не менее 30 секунд. Ни одна временная метка не имеет последующую временную метку в течение 30 секунд от нее (со временем).
Строка 2 с отметкой времени «2014-01-01 06:00:03» не находится в пределах 30 секунд после любой отметки времени. Ближайшим является строка # 1, которая на 58 секунд позже (58 больше 30, поэтому я не знаю, почему вы думаете, что ее следует исключить (учитывая то, что вы сказали, что хотите в своем объяснении)).
Строки 1/3/4 ваших данных примера также не находятся в пределах 30 секунд друг от друга.
Это испытание ниже SQL, но, как я сказал, он возвращает все 4 строки (изменение к отсчету, если вы хотите, граф, я привез строк, иллюстрирующий):
http://sqlfiddle.com/#!3/0d727/20/0
Теперь проверьте этот пример с некоторыми добавлениями данных: (я добавил пятую строку)
http://sqlfiddle.com/#!3/aee67/1/0
insert into tbl values ('2014-01-01 06:01:01',5);
insert into tbl values ('2014-01-01 06:00:03',5);
insert into tbl values ('2014-01-01 06:02:00',5);
insert into tbl values ('2014-01-01 06:02:39',5);
insert into tbl values ('2014-01-01 06:02:30',5);
Обратите внимание, как Ресул запрос t показывает только 3 строки. Это связано с тем, что строка, добавленная мной (№ 5), находится в пределах 30 секунд после строки № 3, поэтому # 3 исключается. Строка №5 также исключается, потому что строка №4 равна 9 секундам (< = 30) позже.Строка №4 возвращается, потому что никакая последующая метка времени не может быть в пределах 30 секунд (никаких временных меток вообще нет).
запрос, чтобы получить деталь:
select *
from tbl t
where not exists
(select 1
from tbl x
where x.id = t.id
and x.timestamp > t.timestamp
and datediff(second, t.timestamp, x.timestamp) <= 30)
запрос, чтобы получить счет на ID:
select id, count(*)
from tbl t
where not exists
(select 1
from tbl x
where x.id = t.id
and x.timestamp > t.timestamp
and datediff(second, t.timestamp, x.timestamp) <= 30)
group by id
Что вы уже пробовали? –