合并两个不应该被历史处理的记录
Merge two records which should not have been history handled
我有一个要求,我必须将两条记录合并为一条,而历史记录不应被处理。在下面的示例中,主要列是 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 ?
这没有得到处理,这里的历史是正确的,因为段每次都改变了,但是因为我们使用了 group by 它得到处理。
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 ?
Teradata 正是针对这种情况对标准 SQL 实施了一个相当未知的扩展,它基于 PERIOD,但可以针对单独的 begin/end 列轻松调整:
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
我有一个要求,我必须将两条记录合并为一条,而历史记录不应被处理。在下面的示例中,主要列是 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 ?
这没有得到处理,这里的历史是正确的,因为段每次都改变了,但是因为我们使用了 group by 它得到处理。
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 ?
Teradata 正是针对这种情况对标准 SQL 实施了一个相当未知的扩展,它基于 PERIOD,但可以针对单独的 begin/end 列轻松调整:
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