1

我在 Teradata 中有一个表,由以下五个主要列组成:

Old   New   Type_of_Old    Type_of_New    Change_Dt
----------------------------------------------------
A     B         0             1            Date 1
B     C         1             1            Date 2
C     D         1             0            Date 3
D     B         0             1            Date 4
B     E         1             1            Date 5

我想绑定从 type_of_old = 0 的第一个元素开始的旧值 - 新值,并在到达最后一个 type_of_old = 1 时切断边界。最后我想要这个数据:

Fırst    Next       Change Dt
-------------------------------
A        B          Date 1
A        C          Date 2
A        D          Date 3
D        B          Date 4
D        E          Date 5

问题是,元素 B 在不同的更改日期是 A 和 D 的下一个元素。因此,当我使用 WITH RECURSIVE 脚本时,它会绑定 B 的下一个元素,以及 A 和 D 的起始元素。

到目前为止,我编写了这个脚本,但是当它达到 type_of_old = 1 时我无法切断界限

CREATE MULTISET TABLE TEST.TABLE_A ( OLD_ELM VARCHAR(1), NEW_ELM VARCHAR(1), 
TYPE_OF_OLD BYTEINT , TYPE_OF_NEW BYTEINT, CHANGE_DT DATE)

INSERT INTO TEST.TABLE_A ('A','B',0, 1, DATE '2018-01-01');
INSERT INTO TEST.TABLE_A ('B','C',1, 1, DATE '2018-02-01');
INSERT INTO TEST.TABLE_A ('C','D',1, 0, DATE '2018-03-01');
INSERT INTO TEST.TABLE_A ('D','B',0, 1, DATE '2018-04-01');
INSERT INTO TEST.TABLE_A ('B','E',1, 1, DATE '2018-05-01');

WITH RECURSIVE ELEMENT_PATH ( FIRST_ELM, NEXT_ELM, CHANGE_DT ) AS 
( SELECT OLD_ELM, NEW_ELM, CHANGE_DT
   FROM TEST.TABLE_A
  WHERE TYPE_OF_OLD = 0
    AND TYPE_OF_NEW = 1

  UNION ALL

 SELECT P.FIRST_ELM, A.NEW_ELM, A.CHANGE_DT
   FROM ELEMENT_PATH P
   JOIN TEST.TABLE_A A ON A.OLD_ELM = P.NEXT_ELM
  WHERE A.CHANGE_DT > P.CHANGE_DT) 
 SELECT * FROM ELEMENT_PATH

该脚本的数据如下:

FIRST_ELM   NEXT_ELM    CHANGE_DT
   A           B        01.01.2018
   A           C        01.02.2018
   A           D        01.03.2018
   D           B        01.04.2018
   D           E        01.05.2018
   A           B        01.04.2018 (Wrong)
   A           E        01.05.2018 (Wrong)
   A           E        01.05.2018 (Wrong)

我该如何解决?

提前致谢,

问候

4

1 回答 1

0

您需要在 where 子句中添加一个额外的条件 (AND TYPE_OF_OLD <> 0) 以删除错误的记录。

WITH RECURSIVE ELEMENT_PATH ( FIRST_ELM, NEXT_ELM, CHANGE_DT ) AS 
( SELECT OLD_ELM, NEW_ELM, CHANGE_DT
   FROM DQRC.TABLE_A
  WHERE TYPE_OF_OLD = 0
    AND TYPE_OF_NEW = 1

  UNION ALL

 SELECT P.FIRST_ELM, A.NEW_ELM, A.CHANGE_DT
   FROM ELEMENT_PATH P
   JOIN DQRC.TABLE_A A 
   ON A.OLD_ELM = P.NEXT_ELM
  WHERE A.CHANGE_DT > P.CHANGE_DT
  AND TYPE_OF_OLD <> 0) 
 SELECT * FROM ELEMENT_PATH

正如我今天刚刚看到的那样,不确定它现在对你有用。

于 2018-10-15T14:19:10.143 回答