我正在使用SQL Server 2005。
请考虑下表,其中包含三列:issueid
,date
和rate
:sqlfiddle.com /#!2/611682
我要找的结果是:
对于issueid 1,2014年3月31日的平均值是2014年1月31日,2014年2月28日和2014年3月31日的费率值的平均值。换句话说,对于每个证券和每个日期,移动平均线是该月和前两个月的利率值的平均值。
我希望将结果转储到表格的新列中。
有没有办法以有效的方式做到这一点?
感谢您的帮助!
答案 0 :(得分:2)
试试这个:
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]
答案 1 :(得分:0)
这个工作,如果它总是一个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)