【问题标题】:accessing values in an ARRAY STRUCT in Google Bigquery在 Google Bigquery 中访问 ARRAY STRUCT 中的值
【发布时间】:2020-12-09 01:47:43
【问题描述】:

我是在 Google BigQuery 中查询的新手,我正在尝试在我的查询中展平一个 ARRAY 字段,以便将数组值作为逗号分隔列表中的单个结果列出。在我的查询中,“associations.associatedvids”是交易表中的一个数组字段。我的问题实际上是一个两步问题,因为我还需要将关联的视频与另一个名为联系人的表中的相应名字和姓氏字段进行匹配。 首先,对于联系人 ID,当我执行以下操作时

Select
CAST(property_hs_object_id.value AS String) AS deal_ID,
associations.associatedvids AS associated_contacts_ID
From hubspot_data.deals

我得到这样的结果:

Row    deal_ID         associated_contacts_ID.value 
1      1814103617      3240001
                       3239951
...

但我想要的是:

Row    deal_ID         associated_contacts_ID.value 
1      1814103617      3240001,3239951
...

我尝试了不同的方法来解除数组的嵌套,但似乎无法做到正确。例如,以下尝试返回错误“标量子查询产生了多个元素”。

Select
CAST(property_hs_object_id.value AS String) AS deal_ID,
(select associations.associatedvids from unnest(associations.associatedvids)) AS associated_contacts_ID
From hubspot_data.deals

其次,我最终想要的是:

Row    deal_ID         associated_contact_names 
1      1814103617      John Doe,Jane Doe
...

名称字段为property_firstname.value 和property_lastname.value,以及associations.associatedvids(数据类型ARRAY)=contacts.vids(数据类型INT64)。 我已经厌倦了以下内容,但是由于数据类型不同,我遇到了错误。

Select
CAST(property_hs_object_id.value AS String) AS deal_ID,
(select concat(property_firstname.value, " ", property_lastname.value)
 from hubspot_data.contacts
 where contacts.vid=associations.associatedvids) AS contact_name
From hubspot_data.deals

任何指导将不胜感激!

编辑:这是我对最小工作示例代码的尝试。我相信我要查询的字段是 STURCT 的数组,我想要的 Struct 元素的数据类型是 INT64。

WITH deals AS (
  Select "012345" as deal_ID,
    [STRUCT(["abc"] as company_ID, [123,678,810] as contact_ID)]
      AS associations)
SELECT 
  deal_ID,
  contacts
FROM deals d
CROSS JOIN UNNEST(d.associations) as contacts

这个给我:

Row    deal_ID    contacts.company_ID    contacts.contact_ID    
1      012345     abc                    123
                                         678
                                         810

但我想要的是

Row    deal_ID    contacts.contact_ID   
1      012345     123, 678, 810

最终,我需要用不同表中的联系人名字和姓氏替换contact_IDs(但幸运的是不在数组中)。

【问题讨论】:

  • 简单易行。但为了真正将答案作为答案 - 您需要提供有关您的数据的更多信息 - 请参阅How to create a Minimal, Reproducible Example
  • 嗨,米哈伊尔,下面我尝试创建一个最小的可重现示例,但我不确定它是否完全解决了我的问题,因为我不完全了解我所在字段的数据结构查询时遇到问题。我相信我试图进入的领域是数据类型为 INT64 的 STRUCT 数组(这可能是 String_AGG 不起作用的原因?)但我不完全确定这意味着什么。编辑:看起来我需要编辑我的原始帖子以获取示例...请参见上文
  • 显示表格架构的最简单方法是在 BQ 控制台中实际定位您的表格 > 单击 Schema 并复制它 - 要捕获的重要部分:字段名称、类型、模式

标签: arrays google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

根据您问题中的有限信息 - 我猜您在问题中提出的第二个查询中缺少 STRING_AGG

应该是

SELECT
  CAST(property_hs_object_id.value AS String) AS deal_ID,
  (SELECT STRING_AGG(associations.associatedvids) FROM UNNEST(associations.associatedvids)) AS associated_contacts_ID
FROM hubspot_data.deals   

更新:回答更新的问题

#standardSQL
SELECT 
  deal_ID,
  ARRAY(
    SELECT AS STRUCT 
      company_ID, 
      ( SELECT STRING_AGG(CAST(id AS STRING), ', ') 
        FROM t.contact_ID id
      ) AS contact_ID 
    FROM d.associations t
  ) AS contacts
FROM deals d

【讨论】:

  • 您好,感谢您的回答。我已经尝试过 STRING_AGG 函数,但它不起作用,因为 associations.associatedvids 是该函数的错误数据类型。例如,我在尝试上述查询时收到以下错误。 No matching signature for aggregate function STRING_AGG for argument types: ARRAY<STRUCT<value INT64>>
  • 谢谢!您的回答帮助我找到了解决方案。我的实际数据与我创建的小示例的结构并不完全相同,但我能够通过您对小示例的回答来弄清楚。
  • 完美。很高兴您有这个想法并能够应用于您的实际用例:o)
  • 我更新了我的问题,添加了一些关于我如何尝试用实际联系人姓名替换contact_ID 的信息。我陷入了如何与数组内的元素进行连接的问题上。如果您能看一下更新,我将不胜感激。
  • 在 SO 上用新问题更新已经回答的问题并不是好的(或无论如何赞赏)做法。相反,您应该发布新问题,我们很乐意在那里为您提供帮助。同时,请将您的更新回滚到之前的 [已回答] 状态
猜你喜欢
  • 2020-10-27
  • 2020-09-21
  • 2021-06-23
  • 2020-09-22
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多