[英]Calculating Moving/Rolling Average in SQL
我正在使用SQL Server 2005。
我有下表(這只是一個簡化的數字示例): http : //sqlfiddle.com/#!2/7cbc81
我想按如下方式填充rate_roll
列:
issueid
的列rate
值都是相同的。 我想做的是計算每個不同日期的2個月滾動平均值。 然后,我想使用這些計算值填充rate_roll
列的行。 請注意,我不想基於issueid
計算滾動平均值。 換句話說,我不想一次為每個issueid
這樣做。 究其原因在於,在這種情況下,對於沒有進入issueid
在日期20140131.因此2,如果是問題的基礎上的問題所做的滾動平均值將是issueid 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;
任何幫助,將不勝感激! 謝謝!
;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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.