Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 移动平均查询MS访问_Ms Access_Subquery_Moving Average - Fatal编程技术网

Ms access 移动平均查询MS访问

Ms access 移动平均查询MS访问,ms-access,subquery,moving-average,Ms Access,Subquery,Moving Average,我试图计算我的数据的移动平均值。我在谷歌上搜索过,在这个网站和其他网站上找到了许多例子,但我仍然感到困惑。我需要计算为特定产品选择的记录的前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

我试图计算我的数据的移动平均值。我在谷歌上搜索过,在这个网站和其他网站上找到了许多例子,但我仍然感到困惑。我需要计算为特定产品选择的记录的前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的提示。为什么没有从mytable中提取b.TMDT

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

我想补充一点,我从另一个方法开始,这个方法很有效,但速度非常慢。对于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;

问题是您使用的是嵌套子查询,据我所知,目前无法为文档找到合适的站点,子查询中的变量范围仅限于子查询的直接父级。这意味着对于嵌套查询,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方法,这可能更有效,只是更难编写和调整。

为什么日期/时间没有年份?我忘了键入它。它确实有年份。格式实际上是mm/dd/yyyy mm:hh:ss am/pmI放弃。如果可以在Access中按组计算最新范围内的前5名,超出我的知识水平。我可能会选择VBA。我可以获得每个prod的前5名并计算该数据集上的平均值,但无法获得“滚动”输出。可以通过在x.prod=y.prod和x.tmdt>=y.tmdt的条件下将表连接到自身,并使用DCOUNT对行进行排序来获得滚动平均值,然后,仅对具有表的秩的行求平均,当前有5200条记录。它将继续增长,很可能会有约15K的记录。我假设这将是一年的数据。有一个主键。PK由5个字段组成。