【问题标题】:How to calculate moving average in SQL?如何在 SQL 中计算移动平均线?
【发布时间】:2026-01-27 16:25:01
【问题描述】:

我在SQL 中有一个包含 2 列的表格

+------+--------+
| WEEK | OUTPUT |
+------+--------+
|    1 |     10 |
|    2 |     20 |
|    3 |     30 |
|    4 |     40 |
|    5 |     50 |
|    6 |     50 |
+------+--------+

我如何计算以总结前 2 周的输出(例如:在第 3 周,它将总结第 3 周、第 2 周和第 1 周的输出),我看过很多教程来做移动平均,但它们是使用日期,就我而言,我想使用(int),这可能吗?

谢谢!。

【问题讨论】:

    标签: sql sql-server moving-average


    【解决方案1】:

    我想你想要这样的东西:

    SELECT *,
           (SELECT Sum(output)
            FROM   table1 b
            WHERE  b.week IN( a.week, a.week - 1, a.week - 2 )) AS SUM
    FROM   table1 a 
    

    In 子句可以转换为between a.week-2 and a.week

    sql fiddle

    【讨论】:

      【解决方案2】:

      您可以使用自联接。这个想法是把你的表放在自己旁边,条件是把匹配的行放在一行中:

      SELECT * FROM [output] o1
      INNER JOIN [output] o2 ON o1.Week between o2.Week and o2.Week + 2
      

      这个选择会产生这个输出:

      o1.Week    o1.Output    o2.Week    o2.Output
      --------------------------------------------
      1          10           1          10
      2          20           1          10
      2          20           2          20
      3          30           1          10
      3          30           2          20
      3          30           3          30
      4          40           2          20
      4          40           3          30
      4          40           4          40
      

      等等。请注意,第 1 周和第 2 周没有前几周可用。

      现在您只需按o1.Week 对数据进行分组并获得SUM

      SELECT o1.Week, SUM(o2.Output) 
      FROM [output] o1
      INNER JOIN [output] o2 ON o1.Week between o2.Week and o2.Week + 2
      GROUP BY o1.Week
      

      【讨论】:

      • @user2315555 非常感谢。我不知道为什么我忘记了
      【解决方案3】:

      如果星期是连续的,你可以简单地使用窗口函数

      SELECT [Week], [Output], 
          SUM([Output]) OVER (ORDER BY [Week] ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
      FROM dbo.SomeTable
      

      Range 更适合您的计算,但尚未在 SQL Server 中实现。其他数据库引擎可能支持

      SELECT [Week], [Output], 
          SUM([Output]) OVER (ORDER BY [Week] RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
      FROM dbo.SomeTable
      

      【讨论】:

        【解决方案4】:

        试试这个:

        SELECT SUM(t1.output) / 3
        FROM yourtable t1
        WHERE t1.week <= 
        (select t2.week from yourtable t2 where t2.week - t1.week > 0 and t2.week - t1.week <= 2)
        

        【讨论】:

          【解决方案5】:

          你不是写你的sqlserver,如果是sqlserver2012或以上,那么简单的例子就是

          declare @table table(wk int,outpt int )
          
          insert into @table values (1,10)
          ,(2,20)
          ,(3,30)
          ,(4,40)
          ,(5,50)
          ,(6,60)
          
          select *,SUM(outpt) over(partition by id order by id rows between unbounded  preceding and current row  ) dd
          from (
          select * , 1 id
          from @table
          where wk < 5
          ) a
          

          【讨论】: