【问题标题】:BigQuery joining two tables and aggregating resultsBigQuery 连接两个表并聚合结果
【发布时间】:2019-02-16 20:53:34
【问题描述】:

我试图从本质上连接两个表,找到两者之间的共同数字,找出 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

我尝试了各种方法,花了几个小时,用谷歌搜索了很多,但我根本无法弄清楚。任何帮助将不胜感激!

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    尝试这样的查询:

    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
    

    【讨论】:

    • 那行得通@vinoaj!我确实必须将contacts.name 定义为contact_name 并按contact_name 代替contacts.name 进行分组,并且效果很好!你太棒了,我非常感谢像你这样愿意提供帮助的开发人员。从字面上看,从第二天 22:00 -> 07:00 开始工作,试图解决这个问题。再次感谢您!
    【解决方案2】:

    以下是 BigQuery 标准 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2018-04-22
      • 2014-01-19
      • 1970-01-01
      • 2022-01-24
      • 2020-08-20
      相关资源
      最近更新 更多