如何解决Teradata TD_NORMALIZE无法帮助合并相邻期间
我认为使用CTE和TD_NORMALIZE_MEET会对我有所帮助。我有多行,例如
**FIELD1 | FIELD2 | FIELD3 | FIELD4 | START_DT | END_DT**
abcd1 | efgh1 | hijk1 | lmno1 | 2019/09/23 | 2019/09/30
abcd1 | efgh1 | hijk1 | lmno1 | 2019/10/01 | 2019/10/25
abcd1 | efgh1 | hijk1 | lmno1 | 2019/11/01 | 2019/11/30
abcd1 | efgh1 | hijk1 | lmno1 | 2019/12/01 | 2019/12/25
abcd1 | efgh1 | hijk1 | lmno1 | 2019/12/26 | 2020/01/10
abcd1 | efgh1 | hijk1 | lmno1 | 2020/01/15 | 2020/01/30
abcd1 | efgh1 | hijk1 | lmno1 | 2020/01/31 | 2020/03/20
abcd1 | efgh1 | hijk1 | lmno1 | 2020/03/28 | 2020/05/25
abcd1 | efgh1 | hijk1 | lmno1 | 2020/06/01 | 2020/09/01
这些应该显示为
**FIELD1 | FIELD2 | FIELD3 | FIELD4 | START_DT | END_DT**
abcd1 | efgh1 | hijk1 | lmno1 | 2019/09/23 | 2019/10/25
abcd1 | efgh1 | hijk1 | lmno1 | 2019/11/01 | 2020/01/10
abcd1 | efgh1 | hijk1 | lmno1 | 2020/01/15 | 2020/03/20
abcd1 | efgh1 | hijk1 | lmno1 | 2020/03/28 | 2020/05/25
abcd1 | efgh1 | hijk1 | lmno1 | 2020/06/01 | 2020/09/01
但是,TD_NORMALIZE_MEET没有帮助。尝试了TD_NORMALIZE_OVERLAP_MEET和所有其他技巧。 任何帮助是极大的赞赏。 我什至尝试使用TD_NORMALIZE_OVERLAP_MEET,方法是在结束日期前加上一天,但这使数据混乱了。因此,我必须遵守日期,但是要以合并日期的方式合并日期,以使其具有最低连续时间段的最小开始日期和最高连续时间段的最大结束日期。
解决方法
正如您所提到的,由于git stash drop
选项需要PERIOD数据类型,并且PERIOD语义“最多但不包括”结束日期时间值,因此您将不得不操作END_DT。
NORMALIZE
,
因此,在继续解决我的问题的过程中,并感谢在座的人们提供了一些精彩的技巧,我不得不发挥创造力。一种是使用CTE(公用表表达式),另一种是为4个字段组创建一个独特的ID字段,因为我以某种方式传递了任何非整数,并且多个字段对我使用的TD_NORMALIZE_OVERLAP_MEET不起作用。 >
我仍在寻找一种解决方案,以使用带有TD_NORMALIZE ...函数的非INT类型的多个组列。请协助。
正如弗雷德(Fred)在上面所建议的,我确实必须将结束日期延长到与下一个开始日期相邻的位置。 我使用DENSE_RANK,以便数字从一个组到另一个组是连续的。
如此
//TOPACCTS EXEC PGM=TOPACCTS
//SYSOUT DD SYSOUT=*
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE01
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE02
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE03
//PRTLINE DD SYSOUT=*
//PRTLINE DD SYSOUT=*
//PRTLINE DD SYSOUT=*
使用它来创建合并表。
CREATE VOLATILE TABLE TBL1 AS
(
SELECT
FIELD1,FIELD2,FIELD3,FIELD4,DENSE_RANK() OVER(PARTITION BY FIELD1,FIELD4
ORDER BY START_DT ASC) AS GRP_RANK,START_DT,END_DT,PERIOD(START_DT,END_DT + 1) AS COVERED_PERIOD
FROM MYTABLE
) WITH DATA
PRIMARY INDEX (FIELD1,SAME_DAY_FLAG)
INDEX (GRP_RANK) ON COMMIT PRESERVE ROWS;
然后我与我的tbl1一起加入了
CREATE VOLATILE TABLE TBL_MERGED AS
(
WITH CTE(GRP_RANK,COVERED_PERIOD) AS
(
SELECT
GRP_RANK,COVERED_PERIOD
FROM TBL1
)
SELECT * FROM TABLE
( TD_SYSFNLIB.TD_NORMALIZE_OVERLAP_MEET(NEW VARIANT_TYPE(CTE.GRP_RANK),CTE.COVERED_PERIOD)
RETURNS(GRP_RANK INT,COVERED_PERIOD PERIOD(DATE))
HASH BY GRP_RANK
LOCAL ORDER BY GRP_RANK,COVERED_PERIOD
) AS TBL_ROWS
)WITH DATA ON COMMIT PRESERVE ROWS;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。