teradata的带日期的移动总和



我有一种情况,我必须创建过去6个月的移动总和。我的数据看起来像

  1. A B 20年1月18日
  2. A B 2018年3月20日45
  3. A B 2018年4月10日15
  4. A B 5月21日-18日30
  5. A B 2010年7月30日至18日
  6. A B 2018年8月15日25

预期结果为

  1. A B 2018年1月20日20行1的总和
  2. A B 2018年3月20日45 65第1+2行之和
  3. A B 2018年4月10日15 80行1+2+3之和
  4. A B 18年5月21日30 110行1+2+3+4之和
  5. A B 2018年7月30日10 100第2+3+4+5行的总和(因为第1行过去>6个月)
  6. A B 2018年8月15日25 125行2+3+4+5+6之和

我试图使用早期线程中提出的解决方案,在没有记录的日期插入伪记录,然后使用181前一行和当前行之间的行

但在某些情况下,同一天可能有多条记录,这意味着选择最后181行将导致最早的记录被删除。

我在这个论坛和其他论坛上查看了很多案例,但找不到窗口大小不恒定的移动平均线的解决方案。请帮忙。

Teradata在Windowed Aggregate中没有实现RANGE,但您可以使用旧式SQL来获得相同的结果。如果每个组的行数不太高,则效率很高,但需要一个中间表(除非group BY列是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可能很有用。

否则,您需要切换到Scalar子查询,它考虑非唯一性,但通常效率较低:

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

要使用现有的方法,您必须首先每天聚合这些多行