在SQL中为滚动平均值创建新列

时间:2014-09-16 14:11:15

标签: sql sql-server sql-server-2005

我正在使用SQL Server 2005。

考虑下表,其中包含三列:issueiddaterate:sqlfiddle.com/#!2/611682。我想创建一个新列,在每个日期显示每个issueid的移动平均值rate。我想将此专栏称为mse_m

我要找的结果是:

enter image description here

对于issueid 1,2014年3月31日的平均值是2014年1月31日,2014年2月28日和2014年3月31日的费率值的平均值。换句话说,对于每个证券和每个日期,移动平均线是该月和前两个月的利率值的平均值。

以下是我的尝试:

update my_table
set mse_m = (
    SELECT AVG(B.rate)
    FROM my_table A
    OUTER APPLY (SELECT *
             FROM my_table
             WHERE i.issueid = A.issueid
             AND i.[date] BETWEEN DATEADD(MONTH,-2,A.[date]) AND A.[date]) B 
    GROUP BY A.issueid, A.[date], A.rate)
from my_table i

但是我收到以下错误:

enter image description here

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

;WITH CTE AS
(
    SELECT A.issueid, A.[date], A.rate, AVG(B.rate) mse_m
    FROM dbo.my_table A
    OUTER APPLY (SELECT *
                 FROM dbo.my_table
                 WHERE issueid = A.issueid
                 AND [date] BETWEEN DATEADD(MONTH,-2,A.[date]) AND A.[date]) B 
    GROUP BY A.issueid, A.[date], A.rate
)
UPDATE A
SET A.mse_m = B.mse_m
FROM dbo.my_table A
INNER JOIN CTE B
    ON A.issueid = B.issueid
    AND A.[date] = B.[date]
    AND A.rate = B.rate;