2012-10-23 3 views
0

항목 테이블이 있으며, 모든 항목에 시작 시간과 종료 시간이 있습니다. 예를 들어날짜 간의 평균 차이를 찾는 방법은 무엇입니까?

:

| id  | item | start  | end  | 
+---------+------+------------+------------+ 
| 2703 | 223 | 2003-12-30 | 2004-01-16 | 
| 47029 | 223 | 2004-04-21 | 2005-01-06 | 
| 1386593 | 223 | 2005-04-19 | 2005-04-19 | 
| 1386739 | 223 | 2005-04-19 | 2006-12-07 | 
| 1432862 | 223 | 2006-02-08 | 2006-02-10 | 

나는 항목 (다음 시작 하나의 끝 사이 일) 사이의 틈을 발견하고 싶습니다. 예제에서 처음 두 항목 사이의 간격은 93 일이며, 마지막 2 사이에는 겹치기 302 일이 있으며, 0으로 계산됩니다. 그래서 예를 들어 테이블에 대한 차이는 다음과 같습니다

96 
103 
0 
0 

내 목표는 평균 차이 (49.75이 예제) 또는 갭 일의 다른-단어 합계 (199)를 찾는 것입니다.

최소 간격 (0) 및 최대 간격 (103)을 갖는 선택적 목표.

지금 내 솔루션은 행을 반복하고 데이터베이스 외부에서 계산하지만 솔루션 솔루션 (MySQL 내부)을 찾고 있습니다. 집계 함수를 살펴 보았지만 가능하지 않다고 생각하지는 않습니다. 평균 격차를 찾는 가장 좋은 방법은 무엇입니까?

답변

4
select avg(if (diff < 0, 0, diff)) 
from (
    select datediff(min(t2.start), t1.end) as diff 
    from Table1 t1 
    inner join Table1 t2 on t1.id < t2.id 
    group by t1.end 
) a 

SQL Fiddle Example

+0

멋진데! 지금 좀 더 깊이 이해하려고 노력할 것입니다 :) –

1

MySQL의 문서에서 테이블

@see DATEDIFF() FROM average_gap AS SELECT DATEDIFF (시작, 종료). 일

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff

반환 번호. 메서드는 뺄셈이므로 SQL 외부에서 네거티브를 처리해야합니다. 그렇지 않으면, 당신은 AVG(DATEDIFF(start, end))

편집 할 수 있습니다

당신이 할 수있는

AVG(GREATEST(DATEDIFF(start,end), 0)) 
+2

나는 2 개의 다른 연속 된 행 사이에 datediff가 필요하다 : 2.'start'와 1.'end'. –

0

무엇 DATEDIFF의 조합 AVG

당신이 SELECT AVG 할 것이 방법 (DATEDIFF는 (시작에 대한, 끝)) AS 간격

EDIT : dang, 펀치에 박자! : P

0

이 당신이 SQL 쿼리에 순수하게 달성 할 수있을거야 일이 아닙니다, 당신은 당신의 응용 프로그램에 데이터를 타고을 결정해야 할거야 이 간격들에서 틈과 겹침이있다.

간단한 코드는 아니지만 작성하는 것이 재미 있어야합니다. 목록을 반복하면서 간격을 계산할 수있는 하나 이상의 비 교차 간격이 남을 때까지 교차 간격을 모두 더하는 것이 좋습니다.

+0

누군가가 표준 SQL로 질문에 답한 것을 감안할 때이 대답을 삭제하는 것이 좋습니다. –

0
select avg(diff) FROM 
(select @rt:=NULL, 
     @rt := if(datediff(start, @end)<0,0,datediff(start, @end)) diff, 
     @end := end from t) t; 
0

이것은 (단지 상황에 따라) 이것은 SQL로만 해결할 수 있습니다.데이터 집계 이제 당신이해야 할 모든

CREATE VIEW items_intervals AS 
SELECT 
    items.end, 
    min(items_1.start) as start 
FROM 
    items inner join items items_1 on items_1.id > items.id 
GROUP BY 
    items.end 

한다 : 나는 모든 간격을 찾으려면이 VIEW을 사용하면 하나에서 두 쿼리를 결합 할 수 있습니다 물론

SELECT 
    min(greatest(0,datediff(start,end))), 
    max(greatest(0,datediff(start,end))), 
    sum(greatest(0,datediff(start,end))), 
    avg(greatest(0,datediff(start,end))) 
FROM 
    items_intervals 

을하지만, 나는 그것들을 분리 된 상태로 유지하는 것을 더 좋아한다.

이러한 쿼리는 id를 사용하여 레코드가 올바르게 정렬 된 경우에만 작동하며, 그렇지 않은 경우에만 수행됩니다.

관련 문제