Sql 12个月移动平均线(按人、日期)
我有一个表[production],其中包含以下结构:Sql 12个月移动平均线(按人、日期),sql,ms-access,ms-access-2010,moving-average,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年8月1日期间每个代表的数据。我希望能够为每个代表创建一个从2012年1月1日开始的12个月移动平均值,如下所示: rep cyc_dt 12moAvg ------------------------- A
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个月移动平均值。我找到了一些模模糊糊接近的例子,我试了试都没用。似乎添加了group by 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
由于相关子查询中没有分组,因此该查询似乎提取了总体平均值或总和。当我尝试按分组时,我得到一个错误,它最多只能返回一行。我认为它可能需要对相关子查询进行两次调整 在DateAdd表达式中减去11个月。 包括另一个WHERE条件,将平均值限制为与包含查询的父查询的当前行相同的代表。 选择 p、 代表, p、 cyc_日期, 选择AvgQ.amt 从生产到质量 哪里 Q.rep=p.rep 和 Q.cyc\U日期介于日期ADDM,-11之间,p.cyc\U日期 和p.cyc_日期 AS[12moavg] 从生产中提取p;
相关子查询可能很慢。确保索引rep和cyc\u date以限制此项的痛苦。cyc\u dt中的值是否始终是当月的第一天?是的,抱歉,这不清楚。每个周期的日期标准化为每月1日。谢谢。那么对于rep A和cyc_dt 2012年1月1日,12moAvg是否代表2011年1月1日至2011年12月1日的平均金额值,或者您是否也将2012年1月1日的平均金额值包含在该平均值中?我想,为了使其成为一个真实的12个月期间,包括当前期间,我会说2012年1月1日的值应包括2011年2月1日至2012年1月1日的数据,端点包括在内。这很有意义,谢谢。现在您熟悉以下哪一项:DateAdd;相关子查询;达夫?宾果。这非常有效。我没有考虑在WHERE语句中显式设置rep相关性。我的头脑完全陷入了一条聚合路线。非常感谢你的帮助。希望这也能对其他人有所帮助。另外,同意对非聚合字段进行索引。幸运的是数据不是太大,所以它运行得比较快。好的,很好。一旦您向我们展示了SQL,我可以看出您与相关子查询非常接近,但只需要通过rep限制平均值。感谢您展示了SQL!