BigQuery: упорядочить столбцы из 2 таблиц, чтобы получить одну таблицу, но получить только уникальные строки из таблицы 2 - PullRequest
0 голосов
/ 29 января 2020

У меня есть две таблицы, и на выходе я хочу одну таблицу со строками из обеих таблиц, расположенными одна под другой.

  • Требование : получить все строки из table1, но исключить строки из table2 с условием, что email или productname отсутствует в table1.

См. изображение. Желтые ячейки в table2 не должны присутствовать в выходных данных, поскольку они присутствуют в table1, как выделено. Так что только ср.но. 2,4,5,7 из таблицы 2 должны присутствовать в выходной таблице.

Example input and desired output

Может кто-нибудь предложить решение?

Логика c, которую я пробовал - UNION, чтобы сначала получить все строки один под другим. Однако я не получаю логи c для исключения совпадающих строк из table2 после UNION. Я пробовал несколько вариантов, как указано ниже в моем коде:

  with a AS (
  SELECT
    email AS leademail,
    website AS leadwebsite,
    productname AS leadproductname,
    source AS leadsource,
    detail AS leaddetail,
    leaddate
  FROM
    `table1`),
  b AS (
  SELECT
    email AS contactemail,
    website AS contactwebsite,
    productname AS contactproductname,
    source AS contactsource,
    detail AS contactdetail,
    contactdate
  FROM
    `table2`)
SELECT
  *
FROM
  a union all
SELECT
  *
FROM
  b
  --option1 except distinct select * from b
  --option2 union all select * from b
  --option3 except distinct select * from b
  --option4 left join
  --(select * from b where contactemail not in (select leademail from a))
ON
  leademail=contactemail
  AND leadproductname=contactproductname

1 Ответ

1 голос
/ 29 января 2020

Мне удалось выполнить этот запрос с помощью оператора UNION ALL для добавления отфильтрованных строк от table2 к table1, и я использовал оператор NOT IN для фильтрации строк из table2.

SELECT
  *
FROM
  table1
UNION ALL (
  SELECT table2.*
  FROM
    table2
  WHERE
    table2.email NOT IN (SELECT email FROM table1)
    OR table2.productname NOT IN (SELECT productname FROM table1)
)

Кроме того, я сделал следующий исполняемый запрос на основе данных вашего примера, чтобы больше людей могло поиграть:

WITH table1 AS (
  SELECT
    "abc@abc.com" AS email,
    "abc.com" AS website,
    "msoffice" AS productname,
    "abc" AS source,
    "one" AS detail,
    "12-Dec-19" AS leaddat
  UNION ALL SELECT "pqr1@pqr1.com","pqr1.com","chrome","pqr1","two","12-Dec-19"
  UNION ALL SELECT "xyz@xyz.com","xyz.com","iphone","xyz",NULL,"12-Dec-19"
  UNION ALL SELECT "zzz@zzz.com","zzz.com","macbook","zzz","three","12-Dec-19"
  UNION ALL SELECT "xyz1@xyz.com","xyz1.com","itunes","xyz1",NULL,"12-Jan-20"
  UNION ALL SELECT "google@google.com",NULL,"googlecloud","xyz2",NULL,"12-Jan-20"
  UNION ALL SELECT "123@123.com","123.com","yahoomail","123","xyz","12-Jan-20"
), table2 as (
  SELECT
    NULL AS email,
    "abc.com" AS website,
    "msoffice" AS productname,
    "abc" AS source,
    "one" AS detail,
    "11-Nov-19" AS leaddat
  UNION ALL SELECT "pqr@pqr.com","pqr.com","playstore","pqr1","two","12-Jan-20"
  UNION ALL SELECT "123@123.com","123.com",NULL,"123","xyz","12-Oct-19"
  UNION ALL SELECT "abc1@abc1.com","abc1.com",NULL,"xyz",NULL,"12-Jan-20"
  UNION ALL SELECT "itunes@apple.com",NULL,"ipod","zzz","three","12-Jan-20"
  UNION ALL SELECT NULL,NULL,"googlecloud","xyz2",NULL,"12-Jan-20"
  UNION ALL SELECT "yahoo@yahoo.com",NULL,"yahoomail",NULL,NULL,"12-Jan-20"
)

SELECT
  *
FROM
  table1
UNION ALL (
  SELECT table2.*
  FROM
    table2
  WHERE
    table2.email NOT IN (SELECT email FROM table1)
    OR table2.productname NOT IN (SELECT productname FROM table1)
)

Надеюсь, это поможет.

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