Saya menggunakan ide bagus Tom H. tetapi melakukannya sedikit berbeda di sini:
Alih-alih menemukan semua baris yang merupakan awal dari rantai, kita dapat menemukan semua waktu itu adalah awal dari rantai, lalu kembali dan temukan baris yang sesuai dengan waktunya.
Pertanyaan #1 di sini akan memberi tahu Anda waktu mana yang merupakan awal dari rantai dengan menemukan waktu mana yang tidak memiliki waktu di bawahnya tetapi dalam 3 detik:
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
Dan kemudian untuk setiap baris, kita dapat menemukan stempel waktu awal rantai terbesar yang lebih kecil dari stempel waktu kita dengan Kueri #2:
SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id
Setelah kami memilikinya, kami dapat mengelompokkannya sesuai keinginan Anda.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime
Saya tidak sepenuhnya yakin ini cukup berbeda dari jawaban Tom H untuk diposting secara terpisah, tetapi sepertinya Anda mengalami masalah dengan implementasi, dan saya sedang memikirkannya, jadi saya pikir saya akan memposting lagi. Semoga berhasil!