没有LAG功能的情况下,按月移动平均值

时间:2018-07-26 01:02:19

标签: sql sql-server-2012

我具有以下一般的表格结构,我需要计算每天平均3/6/9/12的月份,而无需使用滞后函数。

Date       | Amount    
01-01-2018 | 100   
02-01-2018 | 700   
03-01-2018 | 300   
etc   

例如,2018年7月15日的3个月平均值将查找6月15日,5月15日和4月15日的值.5月31日的3个月平均值将需要查找4月30日,3月31日和2月的值28.

LAG可以很好地工作,但是具有可变的偏移量,性能绝对令人恐惧。始终保持说1的偏移量,它可以非常快速地工作。我有日期索引。

下面是我当前的代码,每天使用LAG每天平均要找到3个月的代码,但是同样由于性能不佳,我需要一种很难找到的替代方法。我尝试每天预先计算偏移值,并在函数中引用该列值,但这对性能没有帮助。

(Lag([Amount], DateDiff(d, DateAdd(month, -1, [Date]), [Date]), NULL) OVER (ORDER BY [Date] ASC) +
 Lag([Amount], DateDiff(d, DateAdd(month, -2, [Date]), [Date]), NULL) OVER (ORDER BY [Date] ASC) +
 Lag([Amount], DateDiff(d, DateAdd(month, -3, [Date]), [Date]), NULL) OVER (ORDER BY [Date] ASC)
) / 3

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以尝试加入:

select (t1.amount + t2.amount + t3.amount) / 3
from t t1 left join
     t t2
     on t2.date = dateadd(month, -1, t1.date) left join
     t t3
     on t3.date = dateadd(month, -2, t1.date)