在我过去的6个月中,我不得不创建一个移动总和。我的数据看起来像
预期结果是
我尝试使用在较早版本中提出的解决方案,即为没有记录的日期插入虚拟记录,然后使用181 PRECEDING AND CURRENT ROW之间的行
但是在某些情况下,同一天会有多个记录,这意味着选择最后181行将导致最早的记录被删除。
我已经在这个论坛和其他论坛上检查了很多案例,但是找不到窗口大小不恒定的移动平均值的解决方案。请帮忙。
答案 0 :(得分:0)
Teradata在Windowed Aggregates中没有实现RANGE,但是您可以使用旧式SQL来获得相同的结果。如果每个组的行数不是很高,那将非常有效率,但需要一个中间表(除非GROUP BY列是源表的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
可能会有用。
否则,您需要切换到处理非唯一性但通常效率较低的标量子查询:
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
要使用现有方法,必须每天首先汇总这些多行