2011-04-01 87 views
2

這是後續操作:TSQL Group by N Seconds。 (我得到了我所要求的,但沒有要求正確的事情)TSQL滾動時間分組平均值

我怎樣才能得到1秒組的count(*)的滾動平均?

所以我想每秒返回計數,但我也希望能夠在某些時間間隔內平滑計數,比如10秒。

所以一種方法可能是每10秒鐘取平均值,這可以在TSQL中完成嗎?

理想情況下,時間字段將在Unix時間中返回。

回答

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

好的,所以可能最好嘗試處理應用程序中的數據平滑而不是數據庫... – 2011-04-01 15:31:59