我正在使用SQL Server 2005。
考虑下表,其中包含三列:issueid
,date
和rate
:sqlfiddle.com/#!2/611682。我想创建一个新列,在每个日期显示每个issueid的移动平均值rate
。我想将此专栏称为mse_m
。
我要找的结果是:
对于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
但是我收到以下错误:
任何帮助将不胜感激!谢谢!
答案 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;