2009-05-18 2 views
6

나는 타임 스탬프를 저장하는 mysql 데이터베이스를 가지고있다. 테이블에있는 모든 것이 ID와 타임 스탬프라고 가정 해 봅시다. 시간 소인이 중복 될 수 있습니다.테이블의 행간 평균 시간 차이를 찾는 방법은 무엇입니까?

중복되지 않는 연속 된 행 사이의 평균 시간차를 찾고 싶습니다 (시간 경과). SQL로 할 수있는 방법이 있습니까?

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 기능을 사용하면 등등 일, 월, 초 사이에 선택하고 있습니다 :

답변

29

경우, 귀하의 타임 스탬프 열은 TS, 당신은 초에서 답합니다 :

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

대용량 테이블의 경우 더 빠릅니다. JOIN

이 문제를 해결하는 데 도움이되는 귀여운 수학 트릭을 사용합니다. 잠시 동안 중복 문제를 무시하십시오. 연속 행 간의 평균 시간차는 첫 번째 시간 소인과 마지막 시간 소인의 차이를 행 수 -1로 나눈 값입니다.

증명 : 연속적인 행 사이의 평균 거리는 보존적인 행 사이의 거리의 합계를 연속적인 행의 수로 나눈 것입니다. 그러나 연속 행 간의 차이의 합은 첫 행과 마지막 행 사이의 거리에 불과합니다 (시간 소인별로 정렬되었다고 가정). 그리고 연속 행 수는 총 행 수 -1입니다.

그러면 우리는 타임 스탬프를 구분하기 만하면됩니다.

+0

고마워, 이거 최고야. –

+0

브릴리언트. 시간 소인의 가능한 복제를 해결하는 데 대한 훌륭한 대답. – Bell

+0

잘 했어. 간단한 수학은 언제나 최선의 선택입니다. – Rob

1

여기에 하나의 방법입니다. 아이디의이 인접

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

다음 아이디의 연속하지 않은 경우 사이에

, 당신은에 다른 행이 없다는 규칙을 추가하여 이전 행을 선택할 수 있습니다?

당신이 좋아하는 뭔가를 할 수

,

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 

그것은 당신에게 각 연속 행 쌍에 시간 차이의 목록을 제공합니다 ...

그런 다음 당신은 AVG 그룹화에 그를 마무리 할 수있다. .. 테이블은 t

+0

고정. –

+0

괜찮지 만 ID가 연속적이면이 기능이 작동합니다. 사실 닉의 대답은 내 생각에 더 나은 것입니다. –

관련 문제