sql - 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
这是我能解释的最好的。任何帮助将非常感激 。
解决方案
以下是 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 中的另一个字段 - 所以第一个版本将与
推荐阅读
- android - Cardview 在模拟器上看起来很糟糕
- c++ - 如何确定 SSD 驱动器是固定驱动器还是连接到 USB?
- android - apk 上传失败说密钥库已更改,但密钥库尚未更改
- varnish - 取消将 X-Varnish 标头设置到后端服务器,但将其保留在对客户端的响应中
- docker - 使用 Golang docker SDK 接受用户输入 os.stdin 到容器 - 交互式容器
- python-3.x - urllib.error.URLError:
- c++ - 如何在 C++ 中使用引用删除对象?
- nginx - NGINX 将网络流量重定向到 Netlify 网站
- c# - 读取 8 个字符的压缩十进制 (Comp-3) 数值;但持有 13 位数字并转换为 13 位数值
- sql - Impala 不支持 Unicode 字符