BigQuery объединяет две таблицы и объединяет результаты - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь по существу объединить две таблицы, найти общие числа между ними, выяснить имя call_counterparty и создать таблицу результатов.Я хочу, чтобы он отображал call_counterparty, а не номер, который запрашивается, который в нашем случае является (from_number).Например, если вы позвоните мне, вы будете МОИМ контрагентом in_call, а я вашим контрагентом out_call.Если я позвоню вам, вы будете моим контрагентом out_call, а я вашим контрагентом in_call.Я не уверен, как провести различие между «call_counterparty».

Короче говоря, кому звонит или принимает вызов человек, и каково его имя?Если для таблицы в таблице, к которой нужно присоединиться, не существует имени, отобразите null.Давайте предположим, что мой номер телефона - 2228881111 ... и давайте предположим, что вы даже можете позвонить себе.

Две таблицы базы данных BigQuery, с которыми я работаю:

bigquery.call_log_table

from_number,to_number
2228881111,9997772222
2228881111,8883337777
8883337777,2228881111
2228881111,1112229999
6663332222,2228881111
2228881111,2228881111

bigquery.contact_list_table

number,name
9997772222,John
8883337777,Jill
2228881111,Me

Вот мой текущий код без левого соединения или другого:

SELECT CASE WHEN call_log.from_number = 
'2228881111' THEN 
call_log.to_number ELSE call_log.from_number END AS 
call_counterparty,
SUM(call_log.to_number = '2228881111') AS in_call,
SUM(call_log.from_number = '2228881111') AS out_call

FROM `bigquery.call_log_table` AS call_log

WHERE '2228881111' in (call_log.from_number, call_log.to_number)
GROUP BY call_counterparty

Текущий результат:

call_counterparty,in_call,out_call
9997772222,0,1
8883337777,1,1
1112229999,0,1
6663332222,1,0
2228881111,1,1

РезультатЯ хочу:

call_counterparty,counterparty_name,in_call,out_call
9997772222,John,0,1
8883337777,Jill,1,1
1112229999,<null>,0,1
6663332222,<null>1,0
2228881111,Me,1,1

Я перепробовал все виды, провел часы, погуглил тонну, и я просто не могу понять это.Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  CASE WHEN call_log.from_number = '2228881111' THEN call_log.to_number ELSE call_log.from_number END AS call_counterparty
  , contacts.name
  , SUM(IF(call_log.to_number = '2228881111',1,0)) AS in_call
  , SUM(IF(call_log.from_number = '2228881111',1,0)) AS out_call
FROM `project.dataset.call_log_table` AS call_log
LEFT JOIN `project.dataset.contact_list_table` AS contacts
ON contacts.number = CASE WHEN call_log.from_number = '2228881111' THEN call_log.to_number ELSE call_log.from_number END
WHERE '2228881111' IN (call_log.from_number, call_log.to_number)
GROUP BY call_counterparty, contacts.name
0 голосов
/ 17 февраля 2019

Попробуйте запрос, подобный этому:

WITH call_records AS (
  SELECT 
    CASE WHEN call_log.from_number = '2228881111' THEN call_log.to_number ELSE call_log.from_number END AS call_counterparty
    , SUM(IF(call_log.to_number = '2228881111',1,0)) AS in_call
    , SUM(IF(call_log.from_number = '2228881111',1,0)) AS out_call
  FROM `dataset.call_log_table` AS call_log
  WHERE '2228881111' in (call_log.from_number, call_log.to_number)
  GROUP BY call_counterparty
)
SELECT call_counterparty, contacts.name, in_call, out_call
FROM call_records 
LEFT JOIN `dataset.contact_list_table` as contacts
ON call_records.call_counterparty = contacts.number
GROUP BY call_counterparty, contacts.name, in_call, out_call
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...