2009-05-18 9 views

risposta

29

Se la tabella è t, e la vostra colonna timestamp è ts, e si desidera la risposta in pochi secondi:

SELECT TIMESTAMPDIFF(SECOND, MIN(ts), MAX(ts)) 
    /
     (COUNT(DISTINCT(ts)) -1) 
FROM t 

Questo sarà miglia più veloce per i tavoli di grandi dimensioni in quanto non ha n-quadrato JOIN

Questo utilizza un trucco matematico carino che aiuta con questo problema. Ignora il problema dei duplicati per il momento. La differenza di tempo media tra le righe consecutive è la differenza tra il primo timestamp e l'ultimo timestamp, diviso per il numero di righe -1.

Dimostrazione: la distanza media tra le righe consecutive è la somma della distanza tra le righe consecutive, divisa per il numero di righe consecutive. Ma la somma della differenza tra le righe consecutive è solo la distanza tra la prima riga e l'ultima riga (supponendo che siano ordinate per data/ora). E il numero di righe consecutive è il numero totale di righe -1.

Quindi dobbiamo solo condizionare i timestamp per essere distinti.

+0

Grazie, è fantastico. –

+0

Brillante. Ottima risposta per aggirare la possibile duplicazione dei timestamp. – Bell

+0

Ben fatto. La matematica semplice è sempre l'opzione migliore. – Rob

1

Ecco un modo:

select avg(timestampdiff(MINUTE,prev.datecol,cur.datecol)) 
from table cur 
inner join table prev 
    on cur.id = prev.id + 1 
    and cur.datecol <> prev.datecol 

La funzione timestampdiff consente di scegliere tra i giorni, i mesi, secondi, e così via.

se l'ID di non sono consecutivi, è possibile selezionare la riga precedente con l'aggiunta di una regola che non ci sono altre righe tra:

select avg(timestampdiff(MINUTE,prev.datecol,cur.datecol)) 
from table cur 
inner join table prev 
    on prev.datecol < cur.datecol 
    and not exists (
     select * 
     from table inbetween 
     where prev.datecol < inbetween.datecol 
     and inbetween.datecol < cur.datecol) 
    ) 
2

Sei del ID contigua?

Si potrebbe fare qualcosa di simile,

SELECT 
     a.ID 
     , b.ID 
     , a.Timestamp 
     , b.Timestamp 
     , b.timestamp - a.timestamp as Difference 
FROM 
    MyTable a 
    JOIN MyTable b 
      ON a.ID = b.ID + 1 AND a.Timestamp <> b.Timestamp 

Che ti do un elenco di differenze di tempo su ogni coppia fila consecutiva ...

allora si potrebbe concludere che in un raggruppamento di AVG. ..

+0

corretto. –

+0

OK, ma funzionerà se gli ID sono contigui. In realtà la risposta di Nick è una migliore, immagino. –

Problemi correlati