2017-10-05 3 views
0

인스턴트 메신저로 스택 오버 플로우가 발생했습니다. 얼마나 자주 avg (datediff) 함수를 사용하든 상관 없습니다.고급 평균 날짜 고유 ID가있는 전화 번호

다음과 같은 SQL 테이블이 있습니다.

ID | PersonID | 시작 | 끝

1 | 1 | 2006-03-21 00:00:00 | 2007-05-19 00:00:00 | 활성
2 | 1 | 2007-05-19 00:00:00 | 2007-05-20 00:00:00 | 활성
3 | 2 | 2016-08-24 00:00:00 | 2016-08-25 00:00:00 | 활성
4 | 2 | 2005-08-25 00:00:00 | 2016-08-28 00:00:00 | 활성
5 | 2 | 2016-08-28 00:00:00 | 2017-10-05 00:00:00 | 활성

사람 전체의 평균 활성 체류 (일)를 찾으려고합니다.

즉, EARLIEST 시작 날짜와 LATEST 종료 날짜 (단일 사용자 ID는 여러 활성 상태를 가질 수 있음)에 따라 평균 일수입니다.

예를 들어, 가장 빠른 시작 날짜는 2006-03-21이고 가장 최근의 종료 날짜는 2007-05-20입니다. 따라서 체류 기간은 425 일입니다.

ID 번호 2에 대해 이것을 반복하십시오. 체류 기간은 407 일입니다.

테이블에있는 모든 사람들을 위해이 작업을 수행 한 후 ... 나는 2 개의 고유 한 사람들이 416 인 평균 5 자리수의 평균 체류 기간을 얻고 싶습니다. 모든 행에서 간단한 datediff 평균을 사용하면 나 102는 매우 부정확하다.

희망적이다. 언제나처럼, 당신이 줄 수있는 어떤 도움도 대단히 감사합니다.

+0

결과를 신뢰할 수 없으면 datediff의 결과를 합계하고 집계 된 값의 수로 나눕니다. – iLikeMySql

+0

나는 이것이 자신이하고 싶은 일이라고 생각하지 않습니다. – Binarus

+0

@iLikeMySql은 매우 간단한 방법으로 감사합니다. – it05jb

답변

0

그래서 왜 시도하지 : 물론

SELECT 
    AVG(DATEDIFF(PersonEnd, PersonStart)) 
FROM 
    (SELECT 
    MIN(Start) AS PersonStart, 
    MAX(End) AS PersonEnd 
    FROM 
    table 
    GROUP BY 
    PersonID) PeriodsPerPerson 

, MySQL은 적어도 PersonID에 인덱스를 의미 빠른뿐만 아니라 그룹, 수 MAXMIN 빨리 계산할 수 있도록 적절한 인덱스가 있어야 StartEnd.

어디서나 사용하지는 않지만 내부 쿼리에 별칭이 필요합니다. 만약 당신이 그것을 떠날, 당신은 오류로 실행됩니다, 적어도 MySQL 5.5 (나는 이후 버전에 대해 몰라).

수백만 또는 수십억 개의 행이있는 경우 위에 표시된 것처럼 계산을 저장 프로 시저 또는 백 엔드 응용 프로그램으로 이동하는 것이 좋습니다.

+0

이것에 감사드립니다, 많은 감각을 만들고 정확히 내가 무엇을 찾고있는 것처럼 보입니다. – it05jb