2011-04-01 127 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