Korzystam ze świetnego pomysłu Toma H., ale tutaj robię to trochę inaczej:
Zamiast znajdować wszystkie wiersze, które są początkiem łańcuchów, możemy znaleźć wszystkie czasy to są początki łańcuchów, a następnie wróć i znajdź wiersze pasujące do czasów.
Zapytanie nr 1 powinno powiedzieć Ci, które czasy są początkiem łańcuchów poprzez znalezienie, które czasy nie mają żadnych czasów pod nimi, ale w ciągu 3 sekund:
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
A następnie dla każdego wiersza możemy znaleźć największy znacznik czasu początku łańcucha, który jest mniejszy niż nasz znacznik czasu za pomocą zapytania nr 2:
SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id
Gdy już to mamy, możemy GRUPOWAĆ WEDŁUG, jak chcesz.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime
Nie jestem do końca pewien, czy różni się to wystarczająco od odpowiedzi Toma H, aby opublikować ją osobno, ale brzmiało to, jakbyś miał problem z implementacją i zastanawiałem się nad tym, więc pomyślałem, że opublikuję ponownie. Powodzenia!