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

MySQL GROUP BY DateTime +/- 3 secondi

Sto usando l'ottima idea di Tom H. ma lo sto facendo in modo leggermente diverso qui:

Invece di trovare tutte le righe che sono l'inizio delle catene, possiamo trovare tutte le volte che sono l'inizio delle catenelle, poi torna indietro e trova le righe che corrispondono ai tempi.

La query n. 1 qui dovrebbe dirti quali tempi sono l'inizio delle catene trovando quali tempi non hanno tempi sotto di loro ma entro 3 secondi:

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 quindi per ogni riga, possiamo trovare il timestamp di inizio catena più grande che è inferiore al nostro timestamp con la query 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 volta che l'abbiamo, possiamo RAGGRUPPARLO come volevi.

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

Non sono del tutto sicuro che questo sia abbastanza distinto dalla risposta di Tom H per essere pubblicato separatamente, ma sembrava che tu avessi problemi con l'implementazione e ci stavo pensando, quindi ho pensato di pubblicare di nuovo. Buona fortuna!