2017-08-04 80 views
0

我有一个包含两列的以下结构的表:URL A和URL B.只要URL A变为非活动状态,它就会重定向。 URL B记录重定向,否则为NULL。我现在有一个重定向发生超过1次的问题(比如我们说100次)。我现在正在尝试将最后一次重定向的值指定为每个最终指向最后一次重定向的URL的唯一ID。Redshift上的递归CTE

下面是一个例子:

URL-A URL-B 
AAA NULL 
AAA AAB 
AAB NULL 
AAB AAC 
AAC NULL 

我希望它看起来就像是这样的:

URL Unique-URL 
AAA AAC 
AAB AAC 
AAC AAC 

我知道,我大概可以有若干个连接和子查询做到这一点。但是,我不确定可能有多少重定向,有可能多达100个。我明白,您可以使用Redshift上的递归CTE来解决此问题 - 但不允许这样做。我的选择是什么?

+1

我希望有与redsihit没有任何区别。但你需要一个递归cte https://stackoverflow.com/questions/35979198/understanding-steps-of-recursive-cte –

+0

嗨@JuanCarlosOropeza我发现递归CTE - 显然这是不可用的Redshift。 – Julius

+0

[无效的操作:不支持WITH RECURSIVE]的可能的重复(https://stackoverflow.com/questions/45287067/invalid-operation-with-recursive-is-not-supported) – krokodilko

回答

1

有用户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 
+0

您需要每个URL的最后一次重定向。所以你需要一些递归函数或循环来找出。 –

+0

@JuanCarlosOropeza如果每个事件都有时间戳和用户ID,最后一次重定向只是不带'url_b'和最大时间戳的事件,不是吗? (只有当同一用户有一个链,但对于多个链会话ID将工作 - 整个原则是用排名替换爬行) – AlexYes

+0

你假设所有的URL直接在同一个终点链接,我不认为这是大小写URL_A可以在URL_C上结束,但URL_X在URL_Z上结束,这与时间无关。 –