sql >> Databasteknik >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 sekunder

Jag använder Tom Hs utmärkta idé men gör det lite annorlunda här:

Istället för att hitta alla rader som är början på kedjor kan vi hitta alla tider som är början på kedjor, gå sedan tillbaka och hitta de rader som matchar tiderna.

Fråga #1 här bör berätta vilka tider som är början på kedjor genom att hitta vilka tider som inte har några tider under sig men inom 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

Och sedan för varje rad kan vi hitta den största kedjestarttidsstämpeln som är mindre än vår tidsstämpel med fråga #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 väl har det kan vi GRUPPERA EFTER det som du vill.

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

Jag är inte helt säker på att detta är tillräckligt distinkt från Tom H:s svar för att läggas upp separat, men det lät som att du hade problem med implementeringen, och jag tänkte på det, så jag tänkte att jag skulle göra ett nytt inlägg. Lycka till!



  1. Öka och minska radvärdet med 1 i MySQL

  2. Returnera parametrarna för en lagrad procedur eller användardefinierad funktion i SQL Server (T-SQL-exempel)

  3. En datamodell för peer-to-peer-utlåningsplattform

  4. Vanliga MySQL-fält och deras lämpliga datatyper