如何查询过去12个月的平均值

asm*_*mgx 1 sql sql-server

我有一张包含月度统计数据的表格

Calendar_Date   Month       Monthly Stat
1 Jun 16        Jun-16      1011    
1 Jul 16        Jul-16      1034            
1 Aug 16        Aug-16      1003            
1 Sep 16        Sep-16      991             
1 Oct 16        Oct-16      988             
1 Nov 16        Nov-16      999             
1 Dec 16        Dec-16      994             
1 Jan 17        Jan-17      981             
1 Feb 17        Feb-17      964             
1 Mar 17        Mar-17      966             
1 Apr 17        Apr-17      948             
1 May 17        May-17      942             
1 Jun 17        Jun-17      945             
1 Jul 17        Jul-17      938             
1 Aug 17        Aug-17      942             
1 Sep 17        Sep-17      941             
1 Oct 17        Oct-17      909             
1 Nov 17        Nov-17      911             
1 Dec 17        Dec-17      914             
1 Jan 18        Jan-18      929             
1 Feb 18        Feb-18      913             
Run Code Online (Sandbox Code Playgroud)

我想找到以前的12条记录的年度统计数据所以2017年12月的统计数据将是2017年12月之前的12条记录的总和,即2017年12月+ 11月17日+ 10月17日+ ... + 1月17日除以12

Calendar_Date   Month       Monthly Stat    Yearly Stat
1 Jun 16        Jun-16      1011            -
1 Jul 16        Jul-16      1034            -
1 Aug 16        Aug-16      1003            -
1 Sep 16        Sep-16      991             -
1 Oct 16        Oct-16      988             -
1 Nov 16        Nov-16      999             -
1 Dec 16        Dec-16      994             -
1 Jan 17        Jan-17      981             -
1 Feb 17        Feb-17      964             -
1 Mar 17        Mar-17      966             -
1 Apr 17        Apr-17      948             -
1 May 17        May-17      942             985.08
1 Jun 17        Jun-17      945             979.58
1 Jul 17        Jul-17      938             971.58
1 Aug 17        Aug-17      942             966.50
1 Sep 17        Sep-17      941             962.33
1 Oct 17        Oct-17      909             955.75
1 Nov 17        Nov-17      911             948.33
1 Dec 17        Dec-17      914             941.75
1 Jan 18        Jan-18      929             937.42
1 Feb 18        Feb-18      913             933.17
Run Code Online (Sandbox Code Playgroud)

我可以通过将表连接到自己12次来做到这一点

SELECT *
FROM MyTable A
INNER JOIN  MyTable B ON DATEADD(M,-1,a.Calendar_Date) = b.Calendar_Date
INNER JOIN  MyTable C ON DATEADD(M,-2,a.Calendar_Date) = c.Calendar_Date
...
INNER JOIN  MyTable L ON DATEADD(M,-12,a.Calendar_Date) = l.Calendar_Date
Run Code Online (Sandbox Code Playgroud)

这不是很实际的任何更好的想法如何做到这一点?

And*_*rew 5

你想要的是一个窗口函数.

SELECT Calendar_Date, Month, MonthlyStat, 
  IIF(ROW_NUMBER() OVER(ORDER BY Calendar_Date)>=12,
    ROUND(AVG(CAST(MonthlyStat AS DECIMAL))
      OVER (ORDER BY Calendar_Date ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW),2),
    NULL) AS YearlyStat
FROM MyTable ORDER BY Calendar_Date
Run Code Online (Sandbox Code Playgroud)

AVG(MonthlyStat) OVER (ORDER BY Calendar_Date ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW)获取当前行以及Calendar_Date排序之前的11行,并为您提供平均值.我们CASTMonthlyStat为十进制,因此代码不返回intergers,然后返回ROUND2位小数,因为这是货币.

如果您想在本月之前的12个月内使用ROWS窗口函数中的子句ROWS BETWEEN 12 PRECEDING AND 1 PRECEDING

IIF(ROW_NUMBER() OVER(ORDER BY Calendar_Date)>=12,[...],NULL)测试这是第12行还是以后的行,并且只计算数据存在12个月的那些行的年平均值,为行1-11返回null.如果您确实更改了ROWS子句,则还需要更改此项以跳过另一行,只需更改>=>.

SQLFiddle