递归自加入 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?的主要内容,如果未能解决你的问题,请参考以下文章