Join 基于红移的递归CTE

Join 基于红移的递归CTE,join,amazon-redshift,Join,Amazon Redshift,我有一个表,它具有以下两列结构:URL a和URL B。每当URL a变为非活动状态时,它都会重定向。URL B记录重定向,否则为空。我现在有一个问题,重定向发生超过1次(假设最多100次)。我现在尝试将最后一个重定向的值指定为最终指向最后一个重定向的每个URL的唯一ID 以下是一个例子: URL-A URL-B AAA NULL AAA AAB AAB NULL AAB AAC AAC NULL 我希望它看起来像这样: URL Unique-URL AAA AAC AAB

我有一个表,它具有以下两列结构:URL a和URL B。每当URL a变为非活动状态时,它都会重定向。URL B记录重定向,否则为空。我现在有一个问题,重定向发生超过1次(假设最多100次)。我现在尝试将最后一个重定向的值指定为最终指向最后一个重定向的每个URL的唯一ID

以下是一个例子:

URL-A URL-B
AAA   NULL
AAA   AAB
AAB   NULL
AAB   AAC
AAC   NULL
我希望它看起来像这样:

URL Unique-URL
AAA AAC
AAB AAC
AAC AAC

我知道我可能可以通过几个连接和子查询来实现这一点。但是,我不确定可能有多少重定向,可能多达100个。我知道你可以用红移的递归CTE来解决这个问题,但是这是不允许的。我的备选方案是什么?

拥有每个事件的用户ID和时间戳,您可以使用窗口函数确定每个用户ID的最后一次重定向,然后将其连接回原始事件表,如下所示:

with
redirects_ranked as (
    select user_id,ts,url_a,url_b,row_number() over (partition by user_id order by url_b is null, ts desc)
    from your_table
)
select distinct user_id, t1.url_a, t2.url_b as unique_url
from your_table t1
left join redirects_ranked t2
on t1.user_id=t2.user_id
and t2.row_number=1

我希望与redsihit没有任何区别。但是你需要一个递归cte Hi@JuanCarlosOropeza我发现了递归cte——显然在红移中不可用。可能是重复的,而不是重复的——试图找到一个可以用递归cte解决的问题的解决方案(红移中不存在)。谢谢如果您还有ID和timestamp列来隔离和排序单独的链,则可以使用窗口功能折叠单个链。您需要每个URL的最后一个重定向。因此,您需要一些递归函数或循环来查找。@JuanCarlosOropeza如果每个事件都有时间戳和用户ID,那么最后一次重定向就是具有非空
url\b
和最大时间戳的事件,不是吗?(只有当同一个用户有一个链,但对于多个链,会话id才起作用-整个原则是用排名代替爬行)你假设所有的url都直接在同一个完成链接上,我不认为这种情况url_A可以在url_C上结束,但url_X在url_Z上结束,这与时间无关。@JuanCarlosOropeza是的,我同意,这是一个近似值。会话ID也有助于隔离A到C和X到Z,这只会在同一会话中的路径混乱的情况下留下。但我认为,如果它是定期浏览,那么大部分情况都会被用户ID(+会话ID)分区内的时间排序所覆盖,并且考虑到递归CTE的不可用性,这可能是一个足够好的近似值。