我正在使用SQL Server 2005。
我有下表(这只是一个简化的数值例子):http://sqlfiddle.com/#!2/7cbc81
我想按如下方式填写rate_roll
列:
rate
列的值对于所有issueid
都是相同的。我想要做的是计算每个不同日期的2个月滚动平均值。然后我想使用这些计算值填充列rate_roll
的行。请注意,我不想以issueid
为基础计算滚动平均值。换句话说,我不想一次为每个issueid
执行此操作。原因是,在这种情况下,20140131日没有issueid
2的条目。因此,如果按问题进行,则对于发行方式2,滚动平均值将不同。我想计算每个不同日期的平均值(无论问题如何),然后只填充rate_roll
列。
我尝试过以下操作,但这确实按问题进行计算,这不是我想要实现的目标:
;WITH CTE AS
(
SELECT A.issueid, A.[date], A.rate, AVG(B.mse_m) mse_m_roll
FROM dbo.cmm_backtest A
OUTER APPLY (SELECT *
FROM dbo.cmm_backtest
WHERE issueid = A.issueid
AND [date] BETWEEN DATEADD(MONTH,-1,A.[date]) AND A.[date]) B
GROUP BY A.issueid, A.[date], A.mse_m
)
UPDATE A
SET A.mse_m_roll = B.mse_m_roll
FROM dbo.cmm_backtest A
INNER JOIN CTE B
ON A.issueid = B.issueid
AND A.[date] = B.[date]
AND A.mse_m = B.mse_m;
任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
;WITH CTE (date, avgVal)
AS
(
select A.[DATE], AVG(A.rate)as avg
from my_table A
OUTER APPLY (
SELECT *
FROM dbo.my_table
WHERE issueid = A.issueid
AND [date] BETWEEN DATEADD(MONTH,-1,A.[date]) AND A.[date]) B
group by A.[DATE]
)
update my_table
set rate_roll = CTE.avgVal
FROM CTE
inner join my_table m
on CTE.date = m.date