【问题标题】:Join two tables in BigQuery, using key-value pairs on one table to create columns in the merged table在 BigQuery 中连接两个表,使用一个表上的键值对在合并表中创建列
【发布时间】:2021-11-06 09:53:37
【问题描述】:

我在 BigQuery 中有两个表,但我很难将一个表的内容正确连接到另一个表中。

第一个表的形式是(DataUsers):

userID name lastName
us1 John Anders
us2 Terry Garcia

第二个看起来像这样(DataInfo):

userID key value
us1 address1 us1FirstHome
us2 address1 us2FirstHome
us1 address2 us1SecondHome
us2 address2 us2SecondHome
us1 address3 us1ThirdHome
us2 address3 us2ThirdHome

由于存在键值关系,我想为每个键创建一列。

我已经尝试使用类似下一个的查询来加入表格:

SELECT
  i.name,
  i.lastname,
  CASE WHEN u.key = 'address1' THEN u.value END AS address1 ,
  CASE WHEN u.key = 'address2' THEN u.value END AS address2 ,
  CASE WHEN u.key = 'address3' THEN u.value END AS address3 ,
FROM
  `DataInfo` i
INNER JOIN
  `DataUsers` u
ON
  i.userID = u.userID
WHERE
  (u.key="address1"
    OR u.key="address2"
    OR u.key="address3")

但是,结果是这样的表格:

userID name lastname address1 address2 address3
us1 John Anders us1FirstHome null null
us1 John Anders null us1SecondHome null
us1 John Anders null null us1ThirdHome
us2 Terry Garcia us2FirstHome null null
us2 Terry Garcia null us2SecondHome null
us2 Terry Garcia null null us2ThirdHome

而不是看起来像这样的预期表格:

userID name lastname address1 address2 address3
us1 John Anders us1FirstHome us1SecondHome us1ThirdHome
us2 Terry Garcia us2FirstHome us2SecondHome us2ThirdHome
  • 什么是连接表的正确方法,而不是在 BigQuery 中获取空值?
  • 有没有办法根据键自动创建列,这样就不必硬编码它们的名称?

非常感谢。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    考虑以下(最简洁的)方法

    select * from (
      select * from DataUsers 
      left join DataInfo using(UserID)
    )
    pivot (min(value) for key in ('address1', 'address2', 'address3'))    
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

    • 谢谢!它工作得几乎完美!但是,现在我得到重复的列,如“address1_1”、“address2_1”,其值与“address1”、“address2”列相似。你知道如何解决吗?谢谢
    • 不确定您的意思。您的原始问题已得到回答 - 如果它按要求工作 - 考虑接受并投票。如果您有更多或后续问题 - 发布包含所有相关详细信息的新问题,以便我们提供进一步帮助
    【解决方案2】:

    使用聚合:

    SELECT i.name, i.lastname,
           MAX(CASE WHEN u.key = 'address1' THEN u.value END) AS address1 ,
           MAX(CASE WHEN u.key = 'address2' THEN u.value END) AS address2 ,
           MAX(CASE WHEN u.key = 'address3' THEN u.value END) AS address3 ,
    FROM `DataInfo` i INNER JOIN
         `DataUsers` u
         ON i.userID = u.userID
    WHERE u.key IN ('address1', 'address2', 'address3')
    GROUP BY 1, 2;
    

    【讨论】:

    • 感谢您的回答!它工作得很好,但我接受米哈伊尔的回答是最不冗长的,尽管这两个选项都按预期工作
    猜你喜欢
    • 2021-09-25
    • 2016-08-31
    • 2022-01-24
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多