2009-05-18 13 views

Antwort

29

Wenn Ihre Tabelle t ist, und Ihre Timestamp-Spalte ist ts, und Sie wollen die Antwort in Sekunden:

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

Dies wird für große Tabellen Meilen schneller sein, da es kein N-Quadrat hat.

Dies verwendet einen niedlichen mathematischen Trick, der bei diesem Problem hilft. Ignorieren Sie das Problem der Duplikate für den Moment. Die durchschnittliche Zeitdifferenz zwischen aufeinanderfolgenden Zeilen ist die Differenz zwischen dem ersten Zeitstempel und dem letzten Zeitstempel geteilt durch die Anzahl der Zeilen -1.

Beweis: Der durchschnittliche Abstand zwischen aufeinanderfolgenden Zeilen ist die Summe der Entfernung zwischen aufeinander folgenden Zeilen geteilt durch die Anzahl aufeinanderfolgender Zeilen. Aber die Summe der Differenz zwischen aufeinanderfolgenden Zeilen ist nur der Abstand zwischen der ersten Zeile und der letzten Zeile (vorausgesetzt, sie sind nach Zeitmarken sortiert). Und die Anzahl der aufeinanderfolgenden Zeilen ist die Gesamtzahl der Zeilen -1.

Dann konditionieren wir einfach die Zeitstempel zu unterscheiden.

+0

Danke, das ist großartig. –

+0

Brilliant. Eine gute Antwort auf die mögliche Wiederholung von Zeitstempeln. – Bell

+0

Gut gemacht. Einfache Mathematik ist immer die beste Option. – Rob

1

Hier ist eine Art und Weise:

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 

Die timestampdiff Funktion, die Sie zwischen den Tagen, Monaten Sekunden wählen kann, und so weiter.

Wenn die IDs nicht aufeinander folgend sind, können Sie die vorherige Zeile auswählen, indem Sie eine Regel hinzu, dass es keine anderen Reihen dazwischen:

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

die zusammenhängende die ID sind?

Sie etwas tun könnte, wie,

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 

Das wird Ihnen eine Liste von Zeitdifferenzen auf jeder aufeinanderfolgenden Zeile Paar ...

Dann könnten Sie, dass wickeln in einer AVG Gruppierung auf. ..

+0

behoben. –

+0

OK, aber das funktioniert, wenn die IDs zusammenhängend sind. Eigentlich ist die Antwort von Nick eine bessere, denke ich. –

Verwandte Themen