我正在尝试计算数据的移动平均值。我用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;
答案 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方法,但这可能更有效,只是更难以编写和调整。