SQL中的移动/滚动平均值

时间:2014-09-15 18:18:34

标签: sql sql-server sql-server-2005 moving-average

我正在使用SQL Server 2005。

请考虑下表,其中包含三列:issueiddaterate:sqlfiddle.com /#!2/611682

我要找的结果是:

enter image description here

对于issueid 1,2014年3月31日的平均值是2014年1月31日,2014年2月28日和2014年3月31日的费率值的平均值。换句话说,对于每个证券和每个日期,移动平均线是该月和前两个月的利率值的平均值。

我希望将结果转储到表格的新列中。

有没有办法以有效的方式做到这一点?

感谢您的帮助!

2 个答案:

答案 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)