Sto usando l'ottima idea di Tom H. ma lo sto facendo in modo leggermente diverso qui:
Invece di trovare tutte le righe che sono l'inizio delle catene, possiamo trovare tutte le volte che sono l'inizio delle catenelle, poi torna indietro e trova le righe che corrispondono ai tempi.
La query n. 1 qui dovrebbe dirti quali tempi sono l'inizio delle catene trovando quali tempi non hanno tempi sotto di loro ma entro 3 secondi:
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
E quindi per ogni riga, possiamo trovare il timestamp di inizio catena più grande che è inferiore al nostro timestamp con la query n. 2:
SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id
Una volta che l'abbiamo, possiamo RAGGRUPPARLO come volevi.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime
Non sono del tutto sicuro che questo sia abbastanza distinto dalla risposta di Tom H per essere pubblicato separatamente, ma sembrava che tu avessi problemi con l'implementazione e ci stavo pensando, quindi ho pensato di pubblicare di nuovo. Buona fortuna!