首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >移动和与日期的teradata

移动和与日期的teradata
EN

Stack Overflow用户
提问于 2019-01-06 12:45:02
回答 1查看 367关注 0票数 0

在过去的6个月里,我不得不创造一个可以移动的金额。我的数据看起来

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

预期的结果是

  1. A B 20 -1月18日20 20 row1总额
  2. A B 20-3月18日45 65和row1+2
  3. A B 10-4月18日15 80和row1+2+3
  4. A B 21-5月21-18日30 : 110和row1+2+3+4
  5. A B 30-7月-18 10 100 row2+3+4+5之和(过去row1为>6个月)
  6. A B 15-8月18日25 125和row2+3+4+5+6

我尝试使用先前线程中提出的解决方案,方法是为没有记录的日期插入虚拟记录,然后在181前一行和当前行之间使用行。

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

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

EN

回答 1

Stack Overflow用户

发布于 2019-01-07 22:03:42

Teradata没有在加窗口的集合中实现范围,但是您可以使用老式的SQL来获得相同的结果。如果每个组的行数不太高,那么它是非常有效的,但是需要一个中间表(除非group列是souce表的PI )。PI列上的自连接导致AMP-本地直接连接加上本地聚合,如果没有匹配的PI,它将是一个效率较低的连接加上全局聚合。

代码语言:javascript
运行
复制
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,它关注非唯一性,但通常效率较低:

代码语言:javascript
运行
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54061608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档