BigQuery - невозможно использовать DISTINCT при использовании UNION ALL & STRUCT с разными типами данных - PullRequest
1 голос
/ 04 марта 2020

У меня есть 3 таблицы (выделены зеленым цветом), и я хочу объединить ВСЕ, РУКОВОДИТЕЛИ и КОНТАКТЫ, в каждой из которых нет 1 столбца (выделено красным). Также JOIN, таблица CONTACTS с ACCOUNTS, чтобы получить 3 поля (поэтому красным цветом выделенное поле "code_uk" будет другим столбцом, отсутствующим в LEADS после JOINING. Остальные столбцы Я хочу разместить один под другим (UNION ALL), как указано в запросе.

Требуется вывод:

  1. UNION ALL, LEADS и CONTACTS путем размещения столбцов, как это сделано в запросе ниже - DONE
  2. Строки из CONTACTS где contact_email / contact_product отсутствует в LEADS, т. е. желтые выделенные строки 9,11,14 не должны присутствовать. - DONE
  3. Использовать STRUCT, поскольку в LEADS & # существует несоответствие в количестве столбцов & КОНТАКТЫ - ВЫПОЛНЕНО
  4. Не должно присутствовать только уникальное «lead_email», то есть строки 2 и 5, выделенные синим цветом, из LEADS. Когда я использую отличное (lead_email), ошибка имеет тип STRUCT не может использоваться в SELECT DISTINCT

    • Когда я удаляю «Different» только для проверки правильности работы STRUCT, выводится 15 строк, но я хочу 13 строк (кроме uding 2 & 5).
    • Пробовал "group by", но он также не работает

Может кто-нибудь помочь помочь исправить (4)? См. Изображение

Используемый запрос:

    SELECT distinct(lead_email), lead_id, lead_product, struct<lead_reason string> (lead_reason) /*lead_reason*/, lead_date, lead_employee_count, lead_code, 
struct<contact_cancel_date timestamp> (null) contact_cancel_date,/*null as contact_cancel_date*/ /*null as code_uk*/ struct<code_uk string> (null) code_uk FROM `sample_leads`
union all 
select contact_email,contact_id, contact_product, struct<lead_reason string> (null) contact_reason, contact_date, employee,code_us,struct<contact_cancel_date timestamp> (contact_cancel_date),struct<code_uk string> (code_uk) from `sample_contacts`
left join
(
select account_id, employee, code_us, code_uk from `sample_accounts`)
on contact_id=account_id
where `sample_contacts`.contact_email NOT IN (SELECT lead_email FROM `sample_leads`)
    OR `sample_contacts`.contact_product NOT IN (SELECT lead_product FROM `sample_leads`)
   -- group by 1,2,3,5,6,7,8,9
   -- order by lead_id

Примечание: столбцы «id» и «employee» являются целыми числами, «date» является меткой времени, остальные столбцы являются строка.

Ссылки:

lead_id lead_email  lead_product lead_reason lead_date lead_employee_count  lead_code
1   abc@abc.com msoffice abc  2020-02-23 07:30:02 UTC   1000    1005-C
2   pqr1@pqr1.com chrome pqr1 2020-02-23 07:30:02 UTC   2000    2006-B
3   xyz@xyz.com  iphone  xyz  2020-02-23 07:30:02 UTC   3000    3007-A
4   zzz@zzz.com  macbook zzz  2020-02-23 07:30:02 UTC   4000    4008-B
5   xyz1@xyz.com itunes  xyz1 2020-02-23 07:30:02 UTC   5000    5001-A
6   google@google.com googlecloud xyz2 2020-02-23 07:30:02 UTC 6000 6002-B
7   123@123.com yahoomail junk 2020-02-23 07:30:02 UTC  7000    7003-A
8   abc1@gmail.com            2020-02-23 07:30:02 UTC   8000    8004-B
2   pqr1@pqr1.com   chrome  pqr1    2020-02-23 07:30:02 UTC 2000    2006-B
5   xyz1@xyz.com    itunes  xyz1    2020-02-23 07:30:02 UTC 5000    5001-A

Контакты:

    contact_id  contact_email   contact_product contact_date        contact_cancel_date
    9                         msoffice  2010-01-23 07:30:01 UTC 2020-02-23 
 07:30:02 UTC
    10         pqr@pqr.com   playstore  2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC
    11         123@123.com              2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC
    12         abc1@abc1.com            2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC
    13        itunes@apple.com  ipod    2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC
    14                      googlecloud 2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC
    15        yahoo@yahoo.com           2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC
    16        456@gmail.com             2010-01-23 07:30:01 UTC 2020-02-23 07:30:02 UTC

Счета:

account_id  employee    code_us code_uk
9            100        001-A   450-a
10           200        002-B   451-a
11           300        003-A   452-a
12           400        004-B   453-a
13           500        005-C   454-a
14           600        006-B   455-a
15           700        007-A   456-a
16           800        008-B   457-a

enter image description here

1 Ответ

2 голосов
/ 09 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT
    leadid,
    lead_employee,
    lead_product,
    lead_reason, 
    lead_date,
    COALESCE(lead_employee_count_code_us, employee) AS lead_employee_count_code_us,
    contact_cancel_date,
    COALESCE(lead_code, code_us) AS lead_code,
    code_uk
FROM (
  SELECT DISTINCT
    lead_id AS leadid,
    lead_email AS lead_employee,
    lead_product,
    lead_reason, 
    lead_date,
    lead_employee_count AS lead_employee_count_code_us,
    CAST(NULL AS TIMESTAMP) AS contact_cancel_date,
    lead_code
  FROM `project.dataset.leads`
    UNION ALL
  SELECT 
    contact_id, 
    contact_email,
    contact_product,
    '',
    contact_date, 
    NULL,
    contact_cancel_date,
    ''
  FROM `project.dataset.contacts`
  WHERE NOT EXISTS (SELECT lead_email FROM `project.dataset.leads` WHERE lead_email = contact_email)
  AND NOT EXISTS (SELECT lead_product FROM `project.dataset.leads` WHERE lead_product = contact_product)
)
LEFT JOIN `project.dataset.accounts`
ON leadid = account_id  

Если применить к образцу данных из вашего вопроса - результат

Row leadid  lead_employee       lead_product    lead_reason lead_date               lead_employee_count_code_us contact_cancel_date lead_code   code_uk  
1   1       abc@abc.com         msoffice        abc         2020-02-23 07:30:02 UTC 1000    null                    1005-C  null     
2   2       pqr1@pqr1.com       chrome          pqr1        2020-02-23 07:30:02 UTC 2000    null                    2006-B  null     
3   3       xyz@xyz.com         iphone          xyz         2020-02-23 07:30:02 UTC 3000    null                    3007-A  null     
4   4       zzz@zzz.com         macbook         zzz         2020-02-23 07:30:02 UTC 4000    null                    4008-B  null     
5   5       xyz1@xyz.com        itunes          xyz1        2020-02-23 07:30:02 UTC 5000    null                    5001-A  null     
6   6       google@google.com   googlecloud     xyz2        2020-02-23 07:30:02 UTC 6000    null                    6002-B  null     
7   7       123@123.com         yahoomail       junk        2020-02-23 07:30:02 UTC 7000    null                    7003-A  null     
8   8       abc1@gmail.com      null            null        2020-02-23 07:30:02 UTC 8000    null                    8004-B  null     
9   10      pqr@pqr.com         playstore                   2010-01-23 07:30:01 UTC 200     2020-02-23 07:30:02 UTC         451-a    
10  12      abc1@abc1.com       null                        2010-01-23 07:30:01 UTC 400     2020-02-23 07:30:02 UTC         453-a    
11  13      itunes@apple.com    ipod                        2010-01-23 07:30:01 UTC 500     2020-02-23 07:30:02 UTC         454-a    
12  15      yahoo@yahoo.com     null                        2010-01-23 07:30:01 UTC 700     2020-02-23 07:30:02 UTC         456-a    
13  16      456@gmail.com       null                        2010-01-23 07:30:01 UTC 800     2020-02-23 07:30:02 UTC         457-a    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...