按人、日期划分的 12 个月移动平均线



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

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

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

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

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

我认为它可能适用于对相关子查询进行 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以限制这个的痛苦。

最新更新