Teradata 合并不应处理历史记录的两条记录
我有一个要求,我必须将两个记录合并为一个,而不应该处理历史记录。在下面的示例中,主要列是基于这两条记录的段\类型和段\值,如果其中任何一条发生更改,则应处理历史记录。此处不应处理NR记录的历史记录。有没有办法把这两条记录合并成一条Teradata 合并不应处理历史记录的两条记录,teradata,Teradata,我有一个要求,我必须将两个记录合并为一个,而不应该处理历史记录。在下面的示例中,主要列是基于这两条记录的段\类型和段\值,如果其中任何一条发生更改,则应处理历史记录。此处不应处理NR记录的历史记录。有没有办法把这两条记录合并成一条 PARTY_ID SEGMENT_TYPE SEGMENT_VALUE SEGMENT_START SEGMENT_END 144,088 RC LC 7/11/2010 12
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实现了一个非常未知的扩展,正是在这种情况下,它基于句点,但可以轻松地针对单独的开始/结束列进行调整:
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
请向我们显示预期输出。Hi@TimBiegeleisen,添加了预期输出。@TimBiegeleisen,添加了一个无法处理的场景。您还应显示此新场景的预期输出。此场景不应包含在我们的查询中,基本上它只应处理连续行,喜欢NR NR和不喜欢NR LR NR我希望清楚。我添加了一个未处理的场景。有没有办法只处理第一个案例而不处理第二个案例?@user3901666:
NORMALIZE
将按预期工作,但我忘了使用合并
,以避免空周期,已修复。@d这看起来像是td\u normalize\u overlap\u meet
功能。它们是多余的吗?然后你得到了坏数据,即一个段\ U端