簡體   English   中英

在SQL中計算移動/滾動平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM