Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 Sekunden

Ich verwende die ausgezeichnete Idee von Tom H., mache es hier aber etwas anders:

Anstatt alle Zeilen zu finden, die die Anfänge von Ketten sind, können wir alle Zeiten finden das sind die Anfänge von Ketten, dann gehe zurück und finde die Zeilen, die mit den Zeiten übereinstimmen.

Abfrage Nr. 1 hier sollte Ihnen sagen, welche Zeiten die Anfänge von Ketten sind, indem Sie herausfinden, welche Zeiten keine Zeiten unter sich haben, aber innerhalb von 3 Sekunden:

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

Und dann können wir für jede Zeile den größten Kettenstart-Zeitstempel finden, der kleiner ist als unser Zeitstempel mit Abfrage 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

Sobald wir das haben, können wir es wie gewünscht GRUPPIEREN.

SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime

Ich bin mir nicht ganz sicher, ob sich dies ausreichend von Tom Hs Antwort unterscheidet, um separat gepostet zu werden, aber es klang, als hätten Sie Probleme mit der Implementierung, und ich habe darüber nachgedacht, also dachte ich, ich würde es noch einmal posten. Viel Glück!