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
기반 솔루션을 사용하는 것이 더 좋습니다 (일반적으로 순수한 세트 기반 솔루션보다 성능이 현저히 떨어지더라도).
Oracle
및 PostgreSQL
지원이 절 :
내부 윈도우 버퍼를 유지하고 매우 효율적인
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
, 불행히도, 움직이는 창을 지원하지 않습니다.
좋아요, 아마도 DB 대신 애플리케이션에서 데이터 스무딩을 처리하는 것이 가장 좋습니다 ... –