Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL GROUP BY DateTime +/- 3 segundos


Estou usando a excelente ideia de Tom H., mas fazendo um pouco diferente aqui:

Em vez de encontrar todas as linhas que são o início das cadeias, podemos encontrar todas as vezes que são os inícios das cadeias, depois volte e encontre as linhas que correspondem aos tempos.

A consulta nº 1 aqui deve informar quais horários são o início das cadeias, descobrindo quais horários não têm horários abaixo deles, mas dentro de 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

E, em seguida, para cada linha, podemos encontrar o maior carimbo de data/hora inicial da cadeia que é menor que nosso carimbo de data/hora com a 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

Uma vez que temos isso, podemos GROUP BY como você queria.
SELECT COUNT(*) --or whatever
FROM Table
JOIN ([query #2]) GroupingQuery
ON Table.id = GroupingQuery.id
GROUP BY GroupingQuery.ChainStartTime

Não tenho certeza se isso é distinto o suficiente da resposta de Tom H para ser postado separadamente, mas parecia que você estava tendo problemas com a implementação, e eu estava pensando nisso, então pensei em postar novamente. Boa sorte!