合并两条不应处理历史记录的记录

时间:2018-01-29 06:20:55

标签: teradata

我有一个要求,我必须将两个记录合并为一个,其中不应该处理历史记录。在下面的示例中,主要列是基于这两个记录的segment_type和segment_value,如果其中任何一个更改,则应处理历史记录。这里的NR记录不应该是历史处理的。有没有办法将这两个记录合并为一个。?

PARTY_ID    SEGMENT_TYPE    SEGMENT_VALUE   SEGMENT_START   SEGMENT_END
144,088        RC                  LC       7/11/2010       12/31/2011
144,088        LB                  LC       12/31/2011      5/26/2014
144,088        NR                  ?       5/26/2014        6/7/2015
144,088        NR                  ?       6/7/2015         11/22/2017
144,088        SM                  ?       11/22/2017         ?

预期产出:

PARTY_ID    SEGMENT_TYPE    SEGMENT_VALUE   SEGMENT_START   SEGMENT_END
    144,088        RC                  LC       7/11/2010       12/31/2011
    144,088        LB                  LC       12/31/2011      5/26/2014
    144,088        NR                  ?       5/26/2014        11/22/2017
    144,088        SM                  ?       11/22/2017         ?

这没有得到处理,这里的历史记录是正确的,因为段每次都有变化,但是因为我们已经使用了它来处理它。

PARTY_ID    SEGMENT_TYPE    SEGMENT_VALUE   SEGMENT_START   SEGMENT_END
148,478       GI                ?             7/10/2011 5/19/2015
148,478       KA                ?             5/19/2015 7/8/2015
148,478       GI                ?             7/8/2015  8/27/2015
148,478       KA                ?            8/27/2015  10/6/2015
148,478       GI                ?            10/6/2015  11/26/2015
148,478       KA                ?          11/26/2015   2/24/2016
148,478       GH                 ?          2/24/2016   2/25/2016
148,478       KA                  ?         2/25/2016   10/16/2016
148,478       GI                ?            10/16/2016 ?

1 个答案:

答案 0 :(得分:2)

对于这种情况,Teradata实现了标准SQL的一个非常未知的扩展,它基于PERIOD,但可以很容易地针对单独的开始/结束列进行调整:

SELECT PARTY_ID,SEGMENT_TYPE,SEGMENT_VALUE,
   -- this splits the period back to seperate columns 
   Begin(pd) AS SEGMENT_START, NullIf(End(pd), DATE '9999-12-31') AS SEGMENT_END
FROM
 ( 
   SELECT NORMALIZE -- this returns your normalized result as a period
      PARTY_ID,SEGMENT_TYPE,SEGMENT_VALUE,
      PERIOD(SEGMENT_START,Coalesce(SEGMENT_END, DATE '9999-12-31')) AS pd
   FROM vt
 ) AS dt