Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 secondes

J'utilise l'excellente idée de Tom H., mais je le fais un peu différemment ici :

Au lieu de trouver toutes les lignes qui sont les débuts de chaînes, nous pouvons trouver toutes les heures qui sont les débuts des chaînes, puis revenir en arrière et trouver les lignes qui correspondent aux temps.

La requête n° 1 ici devrait vous dire quelles heures sont les débuts des chaînes en trouvant quelles heures n'ont pas d'heures en dessous mais dans les 3 secondes :

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

Et puis pour chaque ligne, nous pouvons trouver le plus grand horodatage de début de chaîne qui est inférieur à notre horodatage avec la requête 2 :

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

Une fois que nous l'avons, nous pouvons le GROUPER PAR comme vous le souhaitez.

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

Je ne suis pas tout à fait sûr que cela soit suffisamment distinct de la réponse de Tom H pour être publié séparément, mais il semblait que vous aviez des problèmes avec la mise en œuvre, et j'y pensais, alors j'ai pensé que je posterais à nouveau. Bonne chance !