BigQuery - 使用子查询和OR语句加入多个条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BigQuery - 使用子查询和OR语句加入多个条件相关的知识,希望对你有一定的参考价值。

无论如何在多个潜在条件下加入两个表格?

我目前正在将一些代码从Postgres迁移到Bigquery,我加入了多个潜在的值,如:

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和电子邮件匹配),则会有重复的行,我会在使用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.

有没有人想出一个加入多个值的解决方案而不是上面做的?

答案

您可以编写单独的查询,然后使用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

以上是关于BigQuery - 使用子查询和OR语句加入多个条件的主要内容,如果未能解决你的问题,请参考以下文章

google bigQuery 子查询加入

Google BigQuery SQL:使滚动平均子查询或加入对大型数据集更有效

BigQuery 避免多个子查询

Bigquery 事件分析加入 subselect 语句

在 bigquery 中查询多个基于日期的表

加入与子查询