2011-04-01 6 views
2

다음은 최대 : TSQL Group by N Seconds입니다. (내가 원하는 것을 얻었지만 올바른 것을 요구하지 않았다)TSQL 시간 그룹의 롤링 평균

평균 1 초 그룹의 평균을 count(*)으로 어떻게 얻을 수 있습니까?

그래서 초당 계산을 반환하고 싶지만 또한 특정 간격 (예 : 10 초) 동안이를 원활하게 할 수 있기를 원합니다.

그래서 한 가지 방법은 매 10 초마다 평균을 취할 수 있습니다. TSQL에서이를 수행 할 수 있습니까?

이상적으로, 시간 필드는 유닉스 시간에 반환됩니다.

답변

3

SQL Server은 롤링/누적 쿼리에서 특히 좋지 않습니다.

이를 사용할 수 있습니다

WITH q (unix_ts, cnt) AS 
     (
     SELECT DATEDIFF(s, '1970-01-01', ts), COUNT(*) 
     FROM record 
     GROUP BY 
       DATEDIFF(s, '1970-01-01', ts) 
     ) 
SELECT * 
FROM q q1 
CROSS APPLY 
     (
     SELECT AVG(cnt) AS smooth_cnt 
     FROM q q2 
     WHERE q2.unix_ts BETWEEN q1.unix_ts - 5 AND q1.unix_ts + 5 
     ) q2 

그러나,이 매우 효율적하지 않을 수 있습니다, 그것은을 통해 다시 이상 같은 중복 간격을 계산합니다 때문이다.

큰 반전의 경우 중간 결과를 유지할 수있는 CURSOR 기반 솔루션을 사용하는 것이 더 좋습니다 (일반적으로 순수한 세트 기반 솔루션보다 성능이 현저히 떨어지더라도).

OraclePostgreSQL 지원이 절 :

내부 윈도우 버퍼를 유지하고 매우 효율적인
WITH q (unix_ts, cnt) AS 
     (
     SELECT TRUNC(ts, 'ss'), COUNT(*) 
     FROM record 
     GROUP BY 
       TRUNC(ts, 'ss') 
     ) 
SELECT q.*, 
     AVG(cnt) OVER (ORDER BY unix_ts RANGE BETWEEN INTERVAL '-5' SECOND AND INTERVAL '5' SECOND) 
FROM q 

.

SQL Server, 불행히도, 움직이는 창을 지원하지 않습니다.

+1

좋아요, 아마도 DB 대신 애플리케이션에서 데이터 스무딩을 처리하는 것이 가장 좋습니다 ... –