bigquery standal sql - присоединиться к таблице a, если совпадение найдено, кроме таблицы b - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть базовая таблица XYZ со столбцами ниже:

idCustomer, idDevice, дата, время посещения

У меня есть 2 другие таблицы A и B (идентичные) со столбцами, как показано ниже:

idCustomer, idDevice, дата, время посещения, имя канала, имя_среды

Я хочу объединить XYZ с A и B в столбцах: idCustomer, idDevice & visit_time

чтобы получить столбцы: имя_канала, имя_среды (из A или B)

Это сложная часть, с которой я боролся.

Я хочу получить имя_канала, имя_среды из таблицы A, если

XYZ.idCustomer = A.idCustomer и XYZ.visit_time = A.visit_time для любого данного idCustomer

Если совпадений нет, я хочу получить имя_канала, имя_среды из B

если XYZ.idDevice = B.idDevice и XYZ.visit_time = B.visit_time

Это лучшее, что я мог объяснить. Любая помощь приветствуется .

1 Ответ

0 голосов
/ 06 ноября 2018

Ниже для BigQuery Standard 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 - поэтому первая версия должна идти с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...