2017-08-04 10 views
0

私は、次の2つの列を持つテーブルを持っています:URL AとURL B。URL Aが非アクティブになるたびに、それはリダイレクトされます。リダイレクトするURL Bレコード。それ以外の場合はNULLです。私は今、リダイレクトを1回以上発生させるという問題を抱えています(100回まで言いましょう)。私は最終的に最後のリダイレクトを指すすべてのURLの一意のIDとして最後のリダイレクトの値を割り当てようとしています。ここでRedshiftでの再帰CTE

は一例です:私はおそらく参加し、いくつかのとサブクエリでこれを行うことができることを知っている

URL Unique-URL 
AAA AAC 
AAB AAC 
AAC AAC 

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

は、私はそれが見えるようにしたいことは、このです。ただし、リダイレクトが何回あるかわからない場合があります(おそらく100までです)。Redshiftで再帰的なCTEを使用してこの問題を解決できることはわかっていますが、許可されていません。私の選択肢は何ですか?あなたは、すべてのユーザーIDの最後のリダイレクトを決定し、このような元のイベントのテーブルに戻ってそれに参加するために窓関数を使用することができ、各イベントのユーザーIDとタイムスタンプを持つ

+1

私はそこに願っています赤十字との違いはありません。しかし、あなたは再帰的な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

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がある場合、最後のリダイレクトはnullでないイベントです。 'url_b'と最大タイムスタンプです。 (同じユーザーが1つのチェーンを持っていても、複数のチェーンのセッションIDがあれば動作します - 全体の原則はクロールとランキングを入れ替えることです) – AlexYes

+0

あなたはすべてのURLを同じ終了リンクで直接扱っています。 case URL_AはURL_Cで終わることはできますが、URL_Xで終わるURL_Zは、時間とは関係ありません。 –