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