这是对TSQL Group by N Seconds的跟进。 (我得到了我的要求,但没有要求正确的事情)
如何获得1秒count(*)
组的滚动平均值?
所以我想每秒返回一次,但我也希望能够在一定的时间间隔内将其平滑,比如10秒。
所以一种方法可能是每10秒采用一次平均值,这可以在TSQL中完成吗?
理想情况下,时间字段将在Unix时间内返回。
答案 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
的解决方案可能会更好,这样可以保留中间结果(尽管通常它们比纯粹的基于集合的解决方案更差)。
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
不支持移动窗口。