首页 > 解决方案 > bigquery 标准 sql - 如果找到匹配则加入表 a 否则表 b

问题描述

我有一个带有以下列的基表 XYZ:

idCustomer , idDevice , 日期 , visit_time

我有 2 个其他表 A 和 B(相同),列如下:

idCustomer , idDevice , 日期 , visit_time,channel_name,medium_name

我想将 XYZ 与 A 和 B 加入列:idCustomer 、 idDevice 和 visit_time

获取列:channel_name,medium_name(来自 A 或 B)

这是我一直在努力解决的棘手部分。

我想从表 A中获取channel_name,medium_name if

XYZ.idCustomer = A.idCustomer 和 XYZ.visit_time = A.visit_time 对于任何给定的idCustomer

如果没有匹配,那么我想 从 B获取channel_name,medium_name

如果XYZ.idDevice = B.idDevice 和 XYZ.visit_time = B.visit_time

这是我能解释的最好的。任何帮助将非常感激 。

标签: sqlgoogle-bigquery

解决方案


以下是 BigQuery 标准 SQL

#standardSQL
SELECT 
  t.idCustomer, 
  t.idDevice, 
  t.visit_time, 
  CASE 
    WHEN NOT a.idCustomer IS NULL THEN a.channel_name
    WHEN NOT b.idDevice IS NULL THEN b.channel_name
  END channel_name,
  CASE 
    WHEN NOT a.idCustomer IS NULL THEN a.medium_name
    WHEN NOT b.idDevice IS NULL THEN b.medium_name
  END medium_name
FROM `project.dataset.XYZ` t
LEFT JOIN `project.dataset.A` a
ON t.idCustomer = a.idCustomer AND t.visit_time = a.visit_time
LEFT JOIN `project.dataset.B` b
ON t.idDevice = b.idDevice AND t.visit_time = b.visit_time

上面的另一个版本(取决于数据的质量 - 见底部的注释)

#standardSQL
SELECT 
  t.idCustomer, 
  t.idDevice, 
  t.visit_time, 
  COALESCE(a.channel_name, b.channel_name) channel_name,
  COALESCE(a.medium_name, b.medium_name) medium_name,
FROM `project.dataset.XYZ` t
LEFT JOIN `project.dataset.A` a
ON t.idCustomer = a.idCustomer AND t.visit_time = a.visit_time
LEFT JOIN `project.dataset.B` b
ON t.idDevice = b.idDevice AND t.visit_time = b.visit_time

注意:如果两个列 channel_name 和 medium_name 在相应的匹配表中都不为 NULL,则此(第二个)版本将正常工作 - 否则最终可能会导致 A 中的一个字段和 B 中的另一个字段 - 所以第一个版本将与


推荐阅读