sql >> Database teknologi >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 sekunder

Jeg bruger Tom H.s fremragende idé, men gør det lidt anderledes her:

I stedet for at finde alle de rækker, der er begyndelsen på kæder, kan vi finde alle tider det er begyndelsen på kæder, så gå tilbage og find de rækker, der matcher tiderne.

Forespørgsel #1 her skulle fortælle dig, hvilke tider der er begyndelsen af ​​kæder ved at finde ud af, hvilke tider der ikke har nogen tider under dem, men inden for 3 sekunder:

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

Og så for hver række kan vi finde det største kædestarttidsstempel, der er mindre end vores tidsstempel med forespørgsel #2:

SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
FROM Table
JOIN ([query #1]) StartofChains
ON Table.Timestamp >= StartOfChains.TimeStamp
GROUP BY Table.id

Når vi har det, kan vi GRUPPERE EFTER det, som du ville.

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

Jeg er ikke helt sikker på, at dette er adskilt nok fra Tom H's svar til at blive postet separat, men det lød som om, du havde problemer med implementeringen, og jeg tænkte på det, så jeg tænkte, at jeg ville skrive det igen. Held og lykke!



  1. Sender kolonnenavn som parameter i MySQL

  2. Dataprofilering:Opdagelse af datadetaljer

  3. Dataadgang fra Raspberry Pi

  4. mysqlworkbench giver versionsfejl ved eksport af database