Teradata带日期的移动总和

时间:2019-01-06 12:45:03

标签: teradata

在我过去的6个月中,我不得不创建一个移动总和。我的数据看起来像

  1. A B 20-一月18 20
  2. A B 18年3月20日45
  3. A B 10-Apr-18 15
  4. A B 18年5月21日30
  5. A B 18-七月10 10
  6. A B 18-八月15 25

预期结果是

  1. A B 20-Jan-18 20 20第1行的总和
  2. A B 18-Mar-18 45 65第1 + 2行的总和
  3. A B 10-Apr-18 15 80第1 + 2 + 3行的总和
  4. A B 18年5月21日30110第1 + 2 + 3 + 4行的总和
  5. A B 30-Jul-18 10100第2 + 3 + 4 + 5行的总和(因为第1行过去> 6个月)
  6. A B 15-八月18 25125第2 + 3 + 4 + 5 + 6行的总和

我尝试使用在较早版本中提出的解决方案,即为没有记录的日期插入虚拟记录,然后使用181 PRECEDING AND CURRENT ROW之间的行

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

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

1 个答案:

答案 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

要使用现有方法,必须每天首先汇总这些多行