2017-05-08 15 views
2

複数の条件で2つのテーブルを結合する方法はありますか?BigQuery - サブクエリとOR文を使用した複数の条件への結合

私のような複数の潜在的価値に参加しましたところ、私は現在のBigQueryへのPostgresからいくつかのコードを移行してい

SELECT 
* 
FROM 
(
SELECT 
    offer_table.offer_id 
    ,customer_table.customer_name 
    ,customer_table.visit_count 
    ,ROW_NUMBER() OVER (PARTITION BY offer_table.offer_id ORDER BY customer_table.visit_count DESC) AS customer_visit_rank 
FROM 
    offer_table 
    LEFT JOIN customer_table ON 
    (
    offer_table.customer_id = customer_table.customer_id 
    OR offer_table.email = customer_table.email 
    OR offer_table.phone = customer_table.phone 
    ) 
) dummy 
WHERE 
    customer_visit_rank = 1 
私の申し出と顧客のデータは、当社のID、電子メールの一貫性のない使用を持っていたので、私はこれに必要な

、電話欄はすべて有効な可能性があります。複数のフィールドが機能している場合(例:idとemailが一致)、重複する行があり、ORDER BYセクションを使用してランク付けした後、row_numberカラムに基づいてフィルタリングします。私はBigQueryの中に複数の条件に参加しようとすると、

はしかし、私は、このエラーメッセージが表示されます:

LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.

は誰が代わりに上記を行うための複数の値に参加するための解決策を考え出していますか?

+0

は、次の3つの 'JOINのon'の条件のそれぞれのための3つの別々のクエリを実行し、' UNION' OR 'UNION ALLを使用して結果を組み合わせることができます'? 'UNION ALL'は、見つかった行を追加するだけであり、' UNION'のように重複を削除する必要はありません。 だから基本的に 'SELECT ... ON customer_id ... UNION ALL SELECT ... ON email ... UNION ALL SELECT ... ON phone'です。これが正しければ、私はそれを答えることができますか? – flutter

+2

標準SQLを使用します。 –

+0

@flutterそうすることで、offer_idごとに重複する行がありませんか?私は正しいデータを持っているcustomer_table行に一致するoffer_idごとに一意の行を取得しようとしています(この例では最高のvisit_count)。 –

答えて

1

あなたはCOALESCEを使用し、その後、別のクエリを書くことができます。

SELECT 
    * 
FROM 
    (
    SELECT 
     offer_table.offer_id 
     ,COALESCE(c1.customer_name,c2.customer_name,c3.customer_name) 
     ,COALESCE(c1.visit_count,c2.visit_count,c3.visit_count) 
     ,ROW_NUMBER() OVER (PARTITION BY offer_table.offer_id ORDER BY customer_table.visit_count DESC) AS customer_visit_rank 
    FROM 
     offer_table 
    LEFT JOIN customer_table c1 
     ON offer_table.customer_id = customer_table.customer_id 
    LEFT JOIN customer_table c2 
     ON offer_table.email = customer_table.email 
    LEFT JOIN customer_table c3 
     ON offer_table.phone = customer_table.phone 
    ) 
) AS dummy 
WHERE 
    customer_visit_rank = 1 
関連する問題