[英]Moving/Rolling Average in SQL
我正在使用SQL Server 2005。
考慮具有三列的下表: issueid
, date
和rate
: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.