2013-10-10 102 views
1

我有一个表[制作]包含以下结构:12个月均线,日期

rep (char(10))  
,cyc_date (datetime) ---- already standardized to mm/01/yyyy 
,amt (decimal) 

我对各rep从1/1/2011到2013年8月1日的数据。我希望能够做的就是创建一个12个月移动平均数开始1/1/2012每个代表,具体如下:

rep cyc_dt 12moAvg 
------------------------- 
A  1/1/2012 10000.01 
A  2/1/2012 13510.05 
.  ........ ........ 
A  8/1/2013 22101.32 
B  1/1/2012 98328.22 
B  ........ ........ 

,其中每一行代表说,代表在规定的时间12个月移动平均数。我发现一些模糊的例子,我尝试了它们无济于事。看来,通过rep组件添加组是与其他示例的主要背离。

这是关于据我得到:

SELECT 
    rep, 
    cyc_date, 
    (
     SELECT Avg([amt]) 
     FROM production Q 
     WHERE Q.[cyc_date] BETWEEN DateAdd("yyyy",-1,[cyc_date]+1) AND [cyc_date] 
    ) AS 12moavg 
FROM production 

该查询似乎总平均值或和拉,因为在相关子查询没有分组。当我尝试分组时,我得到一个错误,它最多只能返回一行。

+0

'cyc_dt'中的值总是在每月的第一天? – HansUp

+0

是的,抱歉,那不清楚。每个cyc_dt的日期都标准化到本月的第一天。 – Jeremy

+0

谢谢。那么对于'rep' A和'cyc_dt' 1/1/2012,'12moAvg'代表2011年1月1日至2011年12月1日期间'amt'值的平均值,还是包含'amt'值2012年1月1日在那个平均? – HansUp

回答

2

我认为它可能适用于相关子查询的2个调整。

  1. DateAdd()表达式中减去11个月。
  2. 包含另一个WHERE条件以将平均值限制为与父(含)查询的当前行相同的rep
SELECT 
    p.rep, 
    p.cyc_date, 
    (
     SELECT Avg(Q.amt) 
     FROM production AS Q 
     WHERE 
       Q.rep = p.rep 
      AND 
       Q.cyc_date BETWEEN DateAdd("m", -11, p.cyc_date) 
        AND p.cyc_date 
    ) AS [12moavg] 
FROM production AS p; 

相关子查询可能会很慢。请务必索引repcyc_date以限制此问题。

+0

宾果。这工作完美。我没有考虑在WHERE语句中显式设置rep关联。我的思想完全在聚合路线上。非常感谢你的帮助。希望这也能帮助其他人。 – Jeremy

+0

另外,同意在非聚合字段上编制索引。幸运的是,数据并不是很大,因此运行速度相对较快。 – Jeremy

+0

好的,很好。一旦你向我们展示了SQL,我可以看到你接近了相关的子查询,但只需通过'rep'约束平均值。感谢您展示SQL! – HansUp

相关问题