递归自加入 Redshift?

Posted

技术标签:

【中文标题】递归自加入 Redshift?【英文标题】:Recursive self join Redshift? 【发布时间】:2019-05-22 17:51:29 【问题描述】:

这是一个红移表,所以我无法使用 PSQL 中的 WITH RECURSIVE。

有一个如下所示的表格:

id | current_leg | previous_leg

1   | AA         |
2   | AB         |
3   | CD         |
4   | RF         | AB
5   | AW         |
6   | FV         | AA
7   | ER         | RF

我想递归地加入它本身,以基本上计算一个 current_leg 有多少 previous_legs,或 current_leg 的深度。所以对于这个例子,输出看起来像:

id | current_leg |count_legs
1  |    AA      |     0
2  |    AB      |     0
3  |    CD      |     0
4  |    RF      |     1
5  |    AW      |     0
6  |    FV      |     1
7  |    ER      |     2

关于如何解决这个问题的任何想法都会很棒。已阅读有关递归 CTE 的问题,但不确定如何使其适用于我的用例。

谢谢!

【问题讨论】:

第 7 行如何为 RF 获得 2? @doddy 。 . . Redshift 绝对不是 Postgres。例如,这很容易在 Postgres 中使用递归 CTE 解决。而且在 Redshift 中也不容易解决。 @mkRabbani 因为 RF 本身有 AB 的 previous_leg。 @GordonLinoff 你说得对,我在 redshift 中无法使用 WITH RECURSIVE。我已经更新了这个问题。有什么想法吗? 从 2021 年 4 月 29 日开始,Redshift 现在使用 WITH RECURSIVE 语法支持递归 CTE,因此现在可以使用原始方法。 aws.amazon.com/about-aws/whats-new/2021/04/…docs.aws.amazon.com/redshift/latest/dg/… 【参考方案1】:

以下脚本为您当前的样本数据提供预期结果。您需要检查此脚本是否适用于更多场景的更多数据-

SELECT A.id,A.current_leg,
CASE 
    WHEN A.previous_leg IS NULL THEN 0
    ELSE 
    (
        SELECT 
        CASE 
            WHEN B.current_leg IS NULL THEN 0 
            ELSE 1 
        END 
        +
        CASE 
            WHEN B.previous_leg  IS NULL THEN 0 
            ELSE 1 
        END

        FROM your_table B 
        WHERE B.id <= A.id 
        AND B.current_leg = A.previous_leg
    ) 
END Coun_legs
FROM your_table A

【讨论】:

以上是关于递归自加入 Redshift?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 复制命令递归扫描

递归地将数据从 redshift 卸载到 S3 存储桶

为啥 Redshift 在加入时会自动修剪 varchar 列?

Redshift加入通配符

在 Redshift 中连接字符串的递归 CTE 替代方案

Redshift 加入元数据表并选择列