sql - T-SQL计算移动平均线

标签 sql tsql sql-server-2008-r2 window-functions moving-average

我正在使用 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/

相关文章:

c# - 数据类型货币 C#

sql - 优化从不同服务器检索超过 10M 条记录的数据

sql - 如何在 SQL Server 中使用 CONTAINSTABLE 获得 'combined' OR 短语排名?

sql - 使用查询为现有表生成 SQL 创建脚本

带日期范围的 SQL 查询

sql - 我们如何在sql server的子查询中使用CTE?

sql-server - T-SQL 中具有可变数量搜索条件的 LIKE 运算符

sql - 获取每个 Group By SQL 的最新记录

sql - 索引 View 在没有索引的情况下编写脚本

sql - 从返回引用游标记录的函数中获取