избежать дублирования при объединении таблиц без уникального идентификатора с использованием внешних ключей - PullRequest
0 голосов
/ 17 июня 2019

Я сталкиваюсь с этой проблемой, когда не знаю, как обрабатывать дублирующиеся строки при объединении двух таблиц.

У меня есть две таблицы, к которым я хотел бы присоединиться

Таблица значений_x:

ID          Campaign      Value_x
foo         fb            1
foo         twitter       3
bar         fb            2
foobar      ads           2
foo         organic       3

Таблица значений_y:

ID          Campaign      Value_y
foo         organic       42
foobar      organic       17
foo         ads           12
foo         twitter       23
bar         twitter       35

Из-за столбца Campaign ID не являются уникальными в каждой таблице, и, например, вывод левой таблицы соединения выглядит следующим образом:

ID          t1.Campaign  t2.Campaign      Value_x  Value_y
foo         fb           organic          1        42
foo         fb           ads              1        12

В идеале я бы хотел получить следующий вывод

ID          t1.Campaign  t2.Campaign      Value_x  Value_y
foo         fb           null             1        null
foo         twitter      twitter          3        23
foo         organic      organic          3        42
foo         null         ads              null     12

Как бы вы справились с такой ситуацией? Я читал кое-что о foreign keys ... Я не знаком с этой концепцией, как она может помочь в этом контексте? Или есть способ выполнить объединение на уровне кампании?

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT ID,
  x.Campaign AS Campaign_x,
  y.Campaign AS Campaign_y,
  Value_x,
  Value_y
FROM `project.dataset.tableX` x
FULL OUTER JOIN `project.dataset.tableY` y
USING(ID, Campaign)

Вы можете протестировать, поиграть с выше, используя примеры данных из ваших вопросов, как в примере ниже

#standardSQL
WITH `project.dataset.tableX` AS (
  SELECT 'foo' ID, 'fb' Campaign, 1 Value_x UNION ALL
  SELECT 'foo', 'twitter', 3 UNION ALL
  SELECT 'bar', 'fb', 2 UNION ALL
  SELECT 'foobar', 'ads', 2 UNION ALL
  SELECT 'foo', 'organic', 3 
), `project.dataset.tableY` AS (
  SELECT 'foo' ID, 'organic' Campaign, 42 Value_y UNION ALL
  SELECT 'foobar', 'organic', 17 UNION ALL
  SELECT 'foo', 'ads', 12 UNION ALL
  SELECT 'foo', 'twitter', 23 UNION ALL
  SELECT 'bar', 'twitter', 35 
)
SELECT ID,
  x.Campaign AS Campaign_x,
  y.Campaign AS Campaign_y,
  Value_x,
  Value_y
FROM `project.dataset.tableX` x
FULL OUTER JOIN `project.dataset.tableY` y
USING(ID, Campaign)
-- ORDER BY ID    

с результатом

Row ID      Campaign_x  Campaign_y  Value_x Value_y  
1   bar     fb          null        2       null     
2   bar     null        twitter     null    35   
3   foo     fb          null        1       null     
4   foo     twitter     twitter     3       23   
5   foo     organic     organic     3       42   
6   foo     null        ads         null    12   
7   foobar  ads         null        2       null     
8   foobar  null        organic     null    17     
2 голосов
/ 17 июня 2019

Похоже, вы хотите full outer join, используя кампанию в качестве условия:

select coalesce(t1.id, t2.id) as id,
       t1.campaign as t1_campaign,
       t2.campaign as t2_campaign,
       Value_x,
       Value_y
from t1
full outer join t2
on t1.id = t2.id
and t1.campaign = t2.campaign
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...