Používám skvělý nápad Toma H., ale tady to dělám trochu jinak:
Místo hledání všech řádků, které jsou počátky řetězců, můžeme najít všechny časy to jsou začátky řetězců, pak se vraťte a vyhledejte řádky, které odpovídají časům.
Dotaz č. 1 by vám měl říci, které časy jsou počátky řetězců, a to tak, že zjistí, které časy nemají žádné časy pod nimi, ale do 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 pak pro každý řádek můžeme najít největší časové razítko začínající řetězcem, které je menší než naše časové razítko s dotazem č. 2:
SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id
Jakmile to budeme mít, můžeme to GROUP BY, jak jste chtěli.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime
Nejsem si úplně jistý, že je to dostatečně odlišné od odpovědi Toma H, aby bylo možné zasílat samostatně, ale znělo to, jako byste měli potíže s implementací, a přemýšlel jsem o tom, tak jsem si řekl, že to napíšu znovu. Hodně štěstí!