2009-05-18 22 views

Respuesta

29

Si la tabla es t, y su columna de marca de tiempo es ts, y desea que la respuesta en segundos:

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

Esto será millas más rápido para tablas grandes ya que no tiene n-squared JOIN

Esto utiliza un lindo truco matemático que ayuda con este problema. Ignora el problema de los duplicados por el momento. La diferencia de tiempo promedio entre filas consecutivas es la diferencia entre la primera marca de tiempo y la última marca de tiempo, dividida por el número de filas -1.

Prueba: La distancia promedio entre filas consecutivas es la suma de la distancia entre filas consecutivas, dividida por el número de filas consecutivas. Pero la suma de la diferencia entre filas consecutivas es solo la distancia entre la primera fila y la última fila (suponiendo que estén ordenadas por marca de tiempo). Y el número de filas consecutivas es el número total de filas -1.

A continuación, simplemente condicionamos las marcas de tiempo para que sean distintas.

+0

Gracias, esto es asombroso. –

+0

Brillante. Gran respuesta para evitar la posible duplicación de marcas de tiempo. – Bell

+0

Bien hecho. La matemática simple es siempre la mejor opción. – Rob

1

Aquí hay una manera:

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 

timestampdiff La función le permite elegir entre días, meses, segundo, y así sucesivamente.

Si los identificadores no son consecutivos, se puede seleccionar la fila anterior añadiendo una regla de que no hay otras filas de entre:

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

Son de la ID contigua?

Se podría hacer algo así,

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 

Eso te dará una lista de diferencias de tiempo en cada par de hileras consecutivas ...

entonces se podría concluir que en una agrupación de AVG. ..

+0

fijo. –

+0

OK, pero esto funcionará si los identificadores son contiguos. En realidad, la respuesta de Nick es mejor, supongo. –

Cuestiones relacionadas