我正在使用 SQL Server 2008 R2,试图计算移动平均值。对于我认为的每条记录,我想收集之前 250 条记录的值,然后计算此选择的平均值。
我的 View 列如下:
TransactionID | TimeStamp | Value | MovAvg
----------------------------------------------------
1 | 01.09.2014 10:00:12 | 5 |
2 | 01.09.2014 10:05:34 | 3 |
...
300 | 03.09.2014 09:00:23 | 4 |
TransactionID
是独特的。对于每个 TransactionID
,我想计算列值的平均值,超过以前的 250 条记录。因此对于 TransactionID 300,收集前 250 行中的所有值( View 按 TransactionID 降序排序),然后在列 MovAvg 中写入这些值的平均值。我希望收集一系列记录中的数据。
最佳答案
与更高版本相比,SQL 2008 中的窗口函数相当有限,如果我没记错的话,您只能分区并且不能使用任何行/范围框架限制,但我认为这可能是您想要的:
;WITH cte (rn, transactionid, value) AS (
SELECT
rn = ROW_NUMBER() OVER (ORDER BY transactionid),
transactionid,
value
FROM your_table
)
SELECT
transactionid,
value,
movagv = (
SELECT AVG(value)
FROM cte AS inner_ref
-- average is calculated for 250 previous to current row inclusive
-- I might have set the limit one row to large, maybe it should be 249
WHERE inner_ref.rn BETWEEN outer_ref.rn-250 AND outer_ref.rn
)
FROM cte AS outer_ref
请注意,它将相关子查询应用于每一行,性能可能不是很好。
使用更高版本,您可以使用窗口框架功能并执行以下操作:
SELECT
transactionid,
value,
-- avg over the 250 rows counting from the previous row
AVG(value) OVER (ORDER BY transactionid
ROWS BETWEEN 251 PRECEDING AND 1 PRECEDING),
-- or 250 rows counting from current
AVG(value) OVER (ORDER BY transactionid
ROWS BETWEEN 250 PRECEDING AND CURRENT ROW)
FROM your_table
关于sql - T-SQL计算移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26618353/