2
这是后续操作:TSQL Group by N Seconds。 (我得到了我所要求的,但没有要求正确的事情)TSQL滚动时间分组平均值
我怎样才能得到1秒组的count(*)
的滚动平均?
所以我想每秒返回计数,但我也希望能够在某些时间间隔内平滑计数,比如10秒。
所以一种方法可能是每10秒钟取平均值,这可以在TSQL中完成吗?
理想情况下,时间字段将在Unix时间中返回。
这是后续操作:TSQL Group by N Seconds。 (我得到了我所要求的,但没有要求正确的事情)TSQL滚动时间分组平均值
我怎样才能得到1秒组的count(*)
的滚动平均?
所以我想每秒返回计数,但我也希望能够在某些时间间隔内平滑计数,比如10秒。
所以一种方法可能是每10秒钟取平均值,这可以在TSQL中完成吗?
理想情况下,时间字段将在Unix时间中返回。
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
,不幸的是,不支持移动窗口。
好的,所以可能最好尝试处理应用程序中的数据平滑而不是数据库... – 2011-04-01 15:31:59