废话不多说,直接上解决问题内容,在TERADATA数据库上开发实现
原数据是这样的:
加工完的数据内容是这样的:
原数据4由于没有与其连贯日期的数据行,所以单独成为目标数据第2行
原数据5、6行数据日期链连贯,转成目标数据的第3行
--表里面的数据就是原数据
--创建一个与原数据表结构相同的临时表
--用递归方法处理数据放入临时表
--从临时表加工得到结果集
原数据是这样的:
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
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行
1 1 2003-06-01 2006-05-31
2 1 2010-04-01 2010-08-31
3 1 2012-02-01 9998-12-31
原数据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;
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;
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
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/