ITPub博客

首页 > 数据库 > 数据库开发技术 > WITH RECURSIVE 多条日期链转成一条日期链 TERADATA

WITH RECURSIVE 多条日期链转成一条日期链 TERADATA

原创 数据库开发技术 作者:maijiangde 时间:2014-04-21 11:13:58 0 删除 编辑
废话不多说,直接上解决问题内容,在TERADATA数据库上开发实现
原数据是这样的:
    id    code    开始时间    结束时间
1    1        2003-06-01    2004-05-31
2    1        2004-06-01    2006-01-31
3    1        2006-02-01    2006-05-31
4    1        2010-04-01    2010-08-31
5    1        2012-02-01    2014-01-31
6    1        2014-02-01    9998-12-31

加工完的数据内容是这样的:
    id    code    start_Dt    end_Dt
1    1        2003-06-01    2006-05-31
2    1        2010-04-01    2010-08-31
3    1        2012-02-01    9998-12-31

以上原数据1、2、3行连贯日期的数据链转换成目标数据1行
原数据4由于没有与其连贯日期的数据行,所以单独成为目标数据第2行
原数据5、6行数据日期链连贯,转成目标数据的第3行

--表里面的数据就是原数据
 sel  * from dwmart_cis.jcj_lx;

--创建一个与原数据表结构相同的临时表
 CREATE  VOLATILE MULTISET TABLE  my_jcj (
    id VARCHAR(10)   NOT NULL,
      code VARCHAR(50)   NOT NULL,
      start_Dt DATE FORMAT 'YYYYMMDD'   NOT NULL,
      end_Dt DATE FORMAT 'YYYYMMDD'   NOT NULL
)ON COMMIT PRESERVE ROWS;

--用递归方法处理数据放入临时表
 insert into my_jcj
 WITH RECURSIVE temp_table (id,code,start_Dt,end_Dt,num) AS
(
select
id,code,start_Dt,end_Dt,1
from   dwmart_cis.jcj_lx
union all
select
aa.id,aa.code,aa.start_Dt,bb.end_Dt,aa.num+1
from  temp_table aa,dwmart_cis.jcj_lx bb
where   aa.id=bb.id
and  aa.code =bb.code
and aa.end_Dt +1=bb.start_Dt
)
select
 id,code,start_Dt,end_Dt
from   temp_table
QUALIFY ROW_NUMBER()OVER(PARTITION BY id,code,start_Dt ORDER BY num desc)=1;

--从临时表加工得到结果集
sel  a.id,a.code,a.start_Dt,a.end_Dt
from my_jcj a
QUALIFY ROW_NUMBER()OVER(PARTITION BY id,code,end_Dt ORDER BY start_Dt )=1

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24362799/viewspace-1145920/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2012-04-25

  • 博文量
    4
  • 访问量
    18330