2017-08-04 161 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上結束,這與時間無關。 –