Използвам отличната идея на Том Х., но тук я правя малко по-различно:
Вместо да намираме всички редове, които са началото на вериги, можем да намерим всички време които са началото на вериги, след това се върнете назад и ако намерете редовете, които отговарят на времената.
Заявка №1 тук трябва да ви каже кои времена са началото на вериги, като откриете кои времена нямат времена под тях, но в рамките на 3 секунди:
SELECT DISTINCT Timestamp
FROM Table a
LEFT JOIN Table b
ON (b.Timestamp >= a.TimeStamp - INTERVAL 3 SECONDS
AND b.Timestamp < a.Timestamp)
WHERE b.Timestamp IS NULL
И след това за всеки ред можем да намерим най-голямото времево клеймо за начало на веригата, което е по-малко от нашето времево клеймо със заявка №2:
SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id
След като имаме това, можем да ГРУПИРАМ ПО, както желаете.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime
Не съм напълно сигурен, че това се различава достатъчно от отговора на Tom H, за да бъде публикуван отделно, но звучеше така, сякаш имате проблеми с внедряването и аз мислех за това, така че реших да публикувам отново. Успех!