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

废话不多说,直接上解决问题内容,在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博客 ” ,链接:http://blog.itpub.net/24362799/viewspace-1145920/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24362799/viewspace-1145920/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值