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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...