Tôi đang sử dụng ý tưởng tuyệt vời của Tom H. nhưng làm theo cách khác một chút ở đây:
Thay vì tìm tất cả các hàng là phần bắt đầu của chuỗi, chúng tôi có thể tìm tất cả lần đó là phần bắt đầu của chuỗi, sau đó quay lại và điều chỉnh các hàng phù hợp với thời gian.
Truy vấn số 1 ở đây sẽ cho bạn biết thời điểm nào là thời điểm bắt đầu của chuỗi bằng cách tìm thời gian nào không có bất kỳ thời điểm nào bên dưới chúng nhưng trong vòng 3 giây:
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
Và sau đó đối với mỗi hàng, chúng tôi có thể tìm thấy dấu thời gian bắt đầu chuỗi lớn nhất nhỏ hơn dấu thời gian của chúng tôi với Truy vấn số 2:
SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id
Khi chúng tôi có điều đó, chúng tôi có thể NHÓM THEO nó như bạn muốn.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime
Tôi không hoàn toàn chắc chắn rằng điều này đủ khác biệt với câu trả lời của Tom H để được đăng riêng, nhưng có vẻ như bạn đang gặp khó khăn khi triển khai và tôi đang suy nghĩ về nó, vì vậy tôi nghĩ tôi sẽ đăng lại. Chúc bạn thành công!