我如何 运行 Teradata 递归查询来查找 table 中的层次结构?

How can I run Teradata recursive query to find hierarchies in table?

我有一个table-

ID       Name
A        Steve
AA       Carla
AAA      Anthony
AAAA     Martin
AAB      Casey
AABA     Mark

在上面输入数据

• 员工“Steve”的 ID 为“A”。像这样的单个字符表示客户在没有任何推荐的情况下购买了产品。

• 在史蒂夫的推荐下,卡拉购买了另一件产品并获得了“AA”的ID。这里Carla的客户代码“AA”代表他被ID为“A”的某个客户推荐。

• 在Carla的推荐下,Anthony和Casey购买了产品,并分别获得了“AAA”和“AAB”的ID,表示他们是由Carla推荐的,ID为“AA”。

• 每个推荐人的 ID 都有一个模式,可以在链中一直转换为 ID。

我需要使用 Teradata SQL 递归查询 ONLY

将此 table 转换为以下 table
DATA LINEAGE
1>Steve
1.1>>Carla
1.1.1>>>Anthony
1.1.1.1>>>>Martin
1.1.2>>>Casey
1.1.2.1>>>>Marc

关于此输出,以下几点值得一提:

• 对特定人员的多次推荐按字母顺序排列。例如,Anthony & Casey 按字母升序显示,Anthony 的前缀为 1.1.1,而 Casey 的前缀为 1.1.2。

• 可以有多个客户启动连锁店,即没有任何推荐的直接客户。

• 所有直接客户的输出都应以整数开头(没有点和单个箭头)。

• 启动连锁店的客户,即直接客户之间也应按字母顺序排列。

• 前缀符号“>”的个数对应层级的深度。

这不是递归的,但我觉得没有必要。

CREATE MULTISET VOLATILE TABLE voltest
(
    id VARCHAR(50),
    nm VARCHAR(50)
) PRIMARY INDEX (id) ON COMMIT PREServe ROWS;
INSERT INTO voltest(id,nm) VALUES ('A','Steve');
INSERT INTO voltest(id,nm) VALUES ('AA','Carla');
INSERT INTO voltest(id,nm) VALUES ('AAA','Anthony');
INSERT INTO voltest(id,nm) VALUES ('AAAA','Martin');
INSERT INTO voltest(id,nm) VALUES ('AAB','Casey');
INSERT INTO voltest(id,nm) VALUES ('AABA','Mark');

SELECT
    path || bumpers || nm as "DATA LINEAGE"
FROM
(
    SELECT
        oreplace(TRIM(TRAILING '.' FROM (XMLAGG(trim(id_number) || '.' ORDER BY token_index) (VARCHAR(50)))), ' ', '') as path,
        bumpers,
        nm
    FROM
        (
            SELECT to_number(token, 'xxxxx')-9 as id_number, nm, token, token_index, SUBSTRING('>>>>>>>>>>>>>>' FROM 1 FOR max(token_index) OVER (PARTITION BY nm)) as bumpers
            FROM TABLE (
                REGEXP_SPLIT_TO_TABLE(voltest.nm, volTest.id, '', 'i')
                    RETURNS (nm VARCHAR(50) character set unicode, token_index integer, token varchar(50) CHARACTER SET UNICODE)
                ) AS dt
        ) sub
    GROUP BY nm, bumpers
) sub2

regexp_split_to_table 会将 id 列中的每个字符拆分到它自己的行中,以 nm 为键。我们还捕获了 token_index 中的位置。拆分出的字符被捕获在token中。

我们用to_number吐出你的token十六进制表示的整数值减去9。所以A=1,B=2,等等。

我们在 token_index 上为每个名称使用 window 函数 MAX() 来确定为该名称拉多少箭 >

然后我们将它们拼接在一起 XMLAGG 用句点分隔符聚合令牌字符串(修剪最后一个)。

这将吐出以下内容:

+-------------------+
|   DATA LINEAGE    |
+-------------------+
| 1.1.1.1>>>>Martin |
| 1.1.1>>>Anthony   |
| 1.1.2.1>>>>Mark   |
| 1.1>>Carla        |
| 1>Steve           |
| 1.1.2>>>Casey     |
+-------------------+