我有一张包含月度统计信息的表格
errexit
我想找到以前的12条记录的年度统计数据 因此,2017年12月的统计数据将是2017年12月之前的12条记录的总和,其中 2017年12月+ 11月17日+ 10月17日+ ... + 1月17日除以12 < / p>
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
我可以通过将表连接到自己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
这不是很实用 更好的想法怎么做?
答案 0 :(得分: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
AVG(MonthlyStat) OVER (ORDER BY Calendar_Date ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW)
获取当前行,以及Calendar_Date排序之前的11行,并为您提供平均值。我们CAST
MonthlyStat为十进制,因此代码不返回整数,然后ROUND
到2位小数,因为这是货币。
如果您希望在本月之前的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子句,则还需要更改此项以跳过另一行,只需将>=
更改为>
。
答案 1 :(得分:2)
您应该查看窗口函数,以便将当前和以前的行数据数除以12除以
类似的东西:
SELECT
Calendar_Date
, Month
, Monthly_Stat
, (SUM(Monthly_Stat) OVER (ORDER BY Calendar_Date ROWS BETWEEN 11 PRECEDING AND CURRENT ROW)) / 12 AS Yearly_Stat
FROM MyTable
答案 2 :(得分:1)
df$Time <- sequence(rle(as.character(df$id))$lengths)/32