在SQL中计算移动/滚动平均值

时间:2014-09-17 16:44:45

标签: sql sql-server sql-server-2005 moving-average

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

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

1 个答案:

答案 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