TSQL滚动平均时间分组

时间:2011-04-01 14:56:55

标签: tsql

这是对TSQL Group by N Seconds的跟进。 (我得到了我的要求,但没有要求正确的事情)

如何获得1秒count(*)组的滚动平均值?

所以我想每秒返回一次,但我也希望能够在一定的时间间隔内将其平滑,比如10秒。

所以一种方法可能是每10秒采用一次平均值,这可以在TSQL中完成吗?

理想情况下,时间字段将在Unix时间内返回。

1 个答案:

答案 0 :(得分: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
但是,这可能效率不高,因为它会重复计算相同的重叠间隔。

对于较大的invervals,使用基于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不支持移动窗口。