我有一张包含月度统计数据的表格
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)
这不是很实际的任何更好的想法如何做到这一点?
你想要的是一个窗口函数.
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子句,则还需要更改此项以跳过另一行,只需更改>=为>.