sql >> Base de Datos >  >> RDS >> Mysql

MySQL GRUPO POR DateTime +/- 3 segundos

Estoy usando la excelente idea de Tom H. pero haciéndolo un poco diferente aquí:

En lugar de encontrar todas las filas que son el comienzo de las cadenas, podemos encontrar todas las horas que son los comienzos de las cadenas, luego regresa y encuentra las filas que coinciden con los tiempos.

La consulta n.º 1 aquí debería indicarle qué tiempos son los comienzos de las cadenas al encontrar qué tiempos no tienen ningún tiempo debajo de ellos pero dentro de los 3 segundos:

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

Y luego, para cada fila, podemos encontrar la marca de tiempo de inicio de cadena más grande que sea menor que nuestra marca de tiempo con la Consulta n.° 2:

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

Una vez que tengamos eso, podemos AGRUPAR POR él como quieras.

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

No estoy completamente seguro de que esto sea lo suficientemente distinto de la respuesta de Tom H como para publicarla por separado, pero parecía que tenía problemas con la implementación y estaba pensando en ello, así que pensé en publicar nuevamente. ¡Buena suerte!