我想找出三周的移动平均线。但这里的渔获量是指每天(本周)的渔获量,应追溯到2周的周日(从上周日开始到上周日,不包括本周周日),然后计算到当天。
下面是示例数据。
“日期”列中每天有一个条目。我们需要计算每个lob每个项目的移动平均值。为了简单起见,我只使用了一个项目、一个lob和三周的数据。
以下是预期输出:
说明:
对于7月20日,它从7月5日(2周前的周日)到7月20日获取数据。所以它把这段时间的销售额加起来,是44000,然后除以天数,是16。7月21日也是这样,从7月5日开始到7月21日,这段时间的累计销售额是45000天,天数是17天(所以45000/17=2647.05),以此类推。
我正在努力改变典型的窗口函数查询来实现这一点:
avg(sales) over(partition by project,lob order by date rows 21 preceding)
4条答案
按热度按时间0qx6xfy61#
这是一个teradata解决方案,可以很容易地移植到sqlserver(仅限于
td_sunday
是teradata语法,返回上一个星期日,用于定义星期)。逻辑很简单,基于avg=sum/count:计算每周数据,使用前两周的数据,并将当前周的累计销售额相加。在teradata中相当有效,explain只显示了两个*stat函数步骤。
顺便说一句,这不完全是你的预期结果,因为它返回了7月19日的平均值。但这可以通过一些额外的逻辑来解决。
zdwk9cvp2#
您需要在表或时间维度中添加周数,然后根据周数而不是日期定义窗口。
pdsfdshx3#
t-sql(6月7日是前一个星期日):
2020-07-20={44000,162750}2020-07-21={45000,172647}…等等。。。
wrrgggsh4#
暴力总是存在的:
这是假设
@@datefirst
设置为星期天,因此根据需要进行调整。https://rextester.com/rasth4795