12个月移动平均值按人,日期计算

时间:2013-10-10 14:47:25

标签: sql ms-access ms-access-2010 moving-average

我有一个包含以下结构的表[production]:

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

我有从2011年1月1日到2013年1月1日的每位代表的数据。我希望能够做的是为每个代表创建一个12月移动平均值,从2012年1月1日开始,如下所示:

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

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

1 个答案:

答案 0 :(得分:2)

我认为它可以对相关子查询进行2次调整。

  1. DateAdd()表达式中减去11个月。
  2. 包含另一个WHERE条件,将平均值限制为与父(包含)查询的当前行相同的rep
  3. 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编入索引,以限制此问题的痛苦。