문제

아래 표 1과의 시차의 평균을 취하고 싶습니다. 값은 연속적이지 않으며 때로는 시간 값이 반복되므로 1) 시간별로 정렬해야합니다. 2) 2) 비 유적 값을 버리고 3) 시차 (밀리 초)를 수행 한 다음 4) 결과 차이를 평균화합니다. 가치. 또한 5) Datediff 작업을 _timestamp> = '20091220 11 : 59 : 56.1'및 _timestamp <= _timestamp> = '20091220 11 : 59 : 56.8'과 같은 선택된 시간 범위로 제한합니다. 나는 이것을 모두 모으는 방법에 대해 꽤 혼란 스럽습니다!

1 번 테이블:
_timestamp
2009-12-20 11:59:56.0
2009-12-20 11:59:56.5
2009-12-20 11:59:56.3
2009-12-20 11:59:56.4
2009-12-20 11:59:56.4
2009-12-20 11:59:56.9

도움이 되었습니까?

해결책

여기에 작동하고 추악하지 않은 것이 있습니다.

;WITH Time_CTE AS
(
    SELECT
        MIN(_Timestamp) AS dt,
        ROW_NUMBER() OVER (ORDER BY MIN(_Timestamp)) AS RowNum
    FROM Table1
    GROUP BY _Timestamp
)
SELECT
    t1.dt AS StartDate,
    t2.dt AS EndDate,
    DATEDIFF(MS, t1.dt, t2.dt) AS Elapsed
FROM Time_CTE t1
INNER JOIN Time_CTE t2
ON t2.RowNum = t1.RowNum + 1

예제에서 다음과 같은 출력을 제공합니다.

StartDate               | EndDate                 | Elapsed
------------------------+-------------------------+--------
2009-12-20 11:59:56.000 | 2009-12-20 11:59:56.300 | 300
2009-12-20 11:59:56.300 | 2009-12-20 11:59:56.400 | 100
2009-12-20 11:59:56.400 | 2009-12-20 11:59:56.500 | 100
2009-12-20 11:59:56.500 | 2009-12-20 11:59:56.900 | 400

편집 : 시간 범위를 제한하려면 추가하십시오. WHERE _Timestamp BETWEEN @StartDate AND @EndDate 전에 GROUP BY 선.

edit2 : 그리고 당신이 평균을 원한다면, 그 결승전을 변경하십시오. SELECT t1.dt, ... 진술 :

SELECT AVG(DATEDIFF(MS, t1.dt, t2.dt))
FROM Time_CTE t1 ... (same as above)

다른 팁

1 단계는 고유 한 시간 만 선택하는 것입니다.

SELECT DISTINCT _TimeStamp FROM table 
    WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8';

그런 다음, 당신이 서로의 모든 시간을 서로 비교하고 싶다면 (시간을 어떻게 선택하고 있는지 확실하지 않음) : 당신은 다음과 같이 미친 일을 할 수 있습니다.

SELECT t1._TimeStamp, t2._TimeStamp, DATEDIFF(ms,t1._TimeStamp,t2._TimeStamp) FROM 
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t1 
    INNER JOIN
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t2
WHERE t1._TimeStamp != t2._TimeStamp;

MySQL에서 왔기 때문에 구문이 꺼져있을 수 있지만 비슷한 것이 작동해야합니다.

평균을 원한다면 위의 결과의 평균을 취할 수 있습니다.

SELECT AVG(DATEDIFF(ms,t1._TimeStamp,t2._TimeStamp)) FROM 
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t1 
    INNER JOIN
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t2
WHERE t1._TimeStamp != t2._TimeStamp;

아직 테스트되지 않았지만 이론적으로는 효과가 있다고 생각합니다.

당신이 원하는 것에 대한 나의 가정이 정확하다면, 나는 그것을하는 두 가지 방법을 본다.

직접적인 방법 :

SELECT
    AVG(DATEDIFF(ms, T1.my_time, T2.my_time))
FROM
    My_Table T1
INNER JOIN My_Table T2 ON
    T2.my_time > T1.my_time
WHERE
    NOT EXISTS
    (
        SELECT
            *
        FROM
            My_Table T3
        WHERE
            (T3.my_time > T1.my_time AND T3.my_time < T2.my_time) OR
            (T3.my_time = T1.my_time AND T3.my_pk < T1.my_pk) OR
            (T3.my_time = T2.my_time AND T3.my_pk < T2.my_pk)
    )

까다로운 방법 :

SELECT
    DATEDIFF(ms, MIN(my_time), MAX(my_time))/(COUNT(DISTINCT my_time) - 1)
FROM
    My_Table

결국, 평균 차이는 총 차이를 분리하는 분열의 수로 나눈 것입니다.

제한하려면 날짜 범위의 클로스를 추가해야하며 두 번째 쿼리에서 0으로 나눌 가능성을 설명해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top