在过去的6个月里,我不得不创造一个可以移动的金额。我的数据看起来
预期的结果是
我尝试使用先前线程中提出的解决方案,方法是为没有记录的日期插入虚拟记录,然后在181前一行和当前行之间使用行。
但是,在某些情况下,同一天可能有多个记录,这意味着选择最后181行将导致最早的记录被丢弃。
我在这个论坛和其他论坛上检查了很多案例,但是在窗口大小不是恒定的情况下,我找不到这个移动平均值的解决方案。请帮帮忙。
发布于 2019-01-07 22:03:42
Teradata没有在加窗口的集合中实现范围,但是您可以使用老式的SQL来获得相同的结果。如果每个组的行数不太高,那么它是非常有效的,但是需要一个中间表(除非group列是souce表的PI )。PI列上的自连接导致AMP-本地直接连接加上本地聚合,如果没有匹配的PI,它将是一个效率较低的连接加上全局聚合。
create volatile table vt as
( select a,b,datecol,sumcol
from mytable
) with data
primary index(a,b);
select t1.a, t1.b, t1.datecol
,sum(t2.sumcol)
from vt as t1
join vt as t2
on t1.a=t2.a
and t1.b=t2.b
and t2.datecol between t1.datecol -181 and t1.datecol
group by 1,2,3
当然,如果每天有多行,这将不像预期的那样工作(这将增加由于n*m联接导致的和的行数)。您需要一些独特的列组合,这个defect_id
可能是有用的。
否则,您需要切换到一个Subquery,它关注非唯一性,但通常效率较低:
create volatile table vt as
( select a,b,defect_id,datecol,sumcol
from mytable
) with data
primary index(a,b);
select t1.*
,(select sum(t2.sumcol)
from vt as t2
where t1.a=t2.a
and t1.b=t2.b
and t2.datecol between t1.datecol -181 and t1.datecol
)
from vt as t1
要使用您现有的方法,您必须首先每天聚合这些多行。
https://stackoverflow.com/questions/54061608
复制相似问题