簡體   English   中英

SQL中的移動/滾動平均值

[英]Moving/Rolling Average in SQL

我正在使用SQL Server 2005。

考慮具有三列的下表: issueiddaterate :sqlfiddle.com/#!2/611682

我正在尋找的結果是:

在此處輸入圖片說明

對於Issueid 1,2014年3月31日的平均值是2014年1月31日,2014年2月28日和2014年3月31日的匯率平均值。 換句話說,對於每個證券和每個日期,移動平均值是該月和前兩個月的費率值的平均值。

我希望將結果轉儲到表的新列中。

有什么辦法可以有效地做到這一點?

謝謝您的幫助!

嘗試這個:

SELECT A.issueid, A.[date], A.rate, AVG(B.rate)
FROM test_table A
OUTER APPLY (SELECT *
             FROM test_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
ORDER BY A.issueid, A.[date]

如果總是3個月的滾動,那么這樣做是可行的,使用SQL 2005不會想到更有效的方法

SELECT  r.IssueId, r.date, (r.rate + r1.rate +r2.rate) /3 AS AvgRate
FROM    dbo.Rates AS r
    LEFT OUTER JOIN ( SELECT    Rates.IssueId,
                                Rates.date,
                                Rates.rate
                      FROM      Rates ) r1 ON r1.IssueId = r.IssueId AND r1.date = CONVERT(VARCHAR(10), DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,r.date),0)),1)
    LEFT OUTER JOIN ( SELECT    Rates.IssueId,
                                Rates.date,
                                Rates.rate
                      FROM      Rates ) r2 ON r2.IssueId = r.IssueId AND r2.date = CONVERT(VARCHAR(10), DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,r1.date),0)),1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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