移动平均查询MS Access

时间:2017-08-22 17:55:06

标签: ms-access subquery moving-average

我正在尝试计算数据的移动平均值。我用Google搜索并在本网站和其他网站上找到了很多例子,但我仍然感到难过。我需要计算为特定产品选择的记录的前5个流量的平均值。

我的表格如下:

TMDT                  Prod  Flow
8/21/2017 12:01:00 AM  A    100
8/20/2017 11:30:45 PM  A    150
8/20/2017 10:00:15 PM  A    200
8/19/2017 5:00:00  AM  B    600
8/17/2017 12:00:00 AM  A    300
8/16/2017 11:00:00 AM  A    200
8/15/2017 10:00:31 AM  A    50

我一直在尝试以下查询:

SELECT b.TMDT, b.Flow, (SELECT AVG(Flow) as MovingAVG
  FROM(SELECT TOP 5 * 
  FROM [mytable] a
  WHERE Prod="A" AND [a.TMDT]< b.TMDT
    ORDER BY a.TMDT DESC)) 
  FROM mytable AS b;

当我尝试运行此查询时,我收到了b.TMDT的输入提示。为什么b.TMDT没有从mytable中拉出来?

我是否应该使用不同的方法来计算我的移动平均线?

我想补充一点,我开始使用另一种有效但速度极慢的方法。对于具有100条或更少记录的表,它运行得足够快。但是,如果该表具有超过100条记录,则感觉查询会突然停止。

以下原始方法。 我为每个产品代码创建了两个查询(共有15个产品):Q_ProdA_Rank和Q_ProdA_MovAvg

Q_ProdA_RanK(T_ProdA是包含产品A信息的表格):

SELECT a.TMDT, a.Flow, (Select count(*) from [T_ProdA] 
where TMDT<=a.TMDT) AS Rank
FROM [T_ProdA] AS a
ORDER BY a.TMDT DESC;    

Q_ProdA_MovAvg

SELECT b.TMDT, b.Flow, Round((Select sum(Flow) from [Q_PRodA_Rank] where 
Rank between b.Rank-1 and (b.Rank-5))/IIf([Rank]<5,Rank-1,5),0) AS 
MovingAvg
FROM [Q_ProdA_Rank] AS b;

1 个答案:

答案 0 :(得分:1)

问题是您使用的是嵌套子查询,据我所知(目前无法为文档找到合适的站点),子查询中的变量范围仅限于直接子查询的父级。这意味着对于嵌套查询,b.TMDT不在变量范围内。

编辑:由于这是一个有趣的问题,也是一个问题正确的问题,这里是完整的SQL答案。它比你的尝试稍微复杂,但应该更有效率地运行

它包含一个嵌套的子查询,该子查询首先列出每个TMDT和prod的前5个流,然后对其进行平均,然后将其与实际查询结合起来。

SELECT A.TMDT, A.Prod, B.MovingAverage
FROM MyTable AS A LEFT JOIN (
    SELECT JoinKeys.TMDT, JoinKeys.Prod, Avg(Top5.Flow) As MovingAverage 
    FROM (
            SELECT JoinKeys.TMDT, JoinKeys.Prod, Top5.Flow
            FROM MyTable As JoinKeys INNER JOIN MyTable AS Top5 ON JoinKeys.Prod = Top5.Prod
            WHERE Top5.TMDT In (
                SELECT TOP 5 A.TMDT FROM MyTable As A WHERE JoinKeys.Prod = A.Prod AND A.TMDT < JoinKeys.TMDT ORDER BY A.TMDT
            )
        )
    GROUP BY JoinKeys.TMDT, JoinKeys.Prod
) AS B
ON A.Prod = B.JoinKeys.Prod AND A.TMDT = B.JoinKeys.TMDT

虽然在我之前的版本中我主张采用VBA方法,但这可能更有效,只是更难以编写和调整。