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

时间:2018-02-08 23:01:55

标签: sql sql-server

我有一张包含月度统计信息的表格

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

这不是很实用 更好的想法怎么做?

3 个答案:

答案 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子句,则还需要更改此项以跳过另一行,只需将>=更改为>

SQLFiddle

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

More info in docs.

答案 2 :(得分:1)

df$Time <- sequence(rle(as.character(df$id))$lengths)/32