BigQuery - 分组并使用数组字段作为过滤器

Posted

技术标签:

【中文标题】BigQuery - 分组并使用数组字段作为过滤器【英文标题】:BigQuery - Group by and use an array field as a filter 【发布时间】:2019-10-17 17:56:04 【问题描述】:

大家好,我看到有一些关于数组分组的问题,但没有一个问题(据我搜索)没有使用数组字段作为结果的过滤器!就我而言,我有一个地址数组,想按记录更新日期分组,并根据下面的查询仅查找家庭地址。

WITH last_update AS (SELECT
        owner_id,
        created_at,
        MAX(updated_at) as updated_at
      FROM
        dataset.profile
      GROUP BY
        owner_id, created_at )
SELECT
    profile.name  ,
    profile.emails  ,
    profile.phones  ,
        profile_addresses.city_name  ,
    profile_addresses.state_code,
    FORMAT_TIMESTAMP('%Y-%m', last_update.created_at ) AS month
FROM dataset.profile AS profile
LEFT JOIN UNNEST(profile.addresses) as profile_addresses
INNER JOIN last_update ON profile.owner_id = last_update.owner_id and profile.updated_at = last_update.updated_at and profile.created_at = last_update.created_at

WHERE (profile.status = 'ACTIVE')
AND (profile_addresses.type = 'HOME')
GROUP BY 1,2,3,4,5,6
ORDER BY 6 DESC

无法检索数据 - 无法按 ARRAY 类型的表达式分组 [22:12] 允许

【问题讨论】:

很难从不工作的查询中对您的用例进行逆向工程 - 相反,您可以提供一些输入数据和预期结果的简化示例以及生成它的逻辑。我认为这将大大增加问题得到有意义的回答的机会 如果您删除 emailsphones(并更改 group/order by 语句),您的查询是否有效?我猜这些是类似于addresses 的数组。 通过窗口函数获取最新的个人资料,然后从每个用户的最新个人资料中选择您需要的数据,也可能更容易/更清晰。 你为什么需要分组? 【参考方案1】:

profile.emailsprofile.phones 字段触发了错误,如下所示将它们括起来将修复错误:

    ARRAY_TO_STRING(profile.emails, " ")  ,
    ARRAY_TO_STRING(profile.phones, " ")  ,

【讨论】:

你真的不需要 GROUP BY。如果只是对多个地址进行重复数据删除,则可以使用 SELECT DISTINCT。在您的情况下,它们在语义上是等效的,但更清晰一些。 即使没有 group by 它也没有运行......事实上,表中有一个未知的数组字段,并且提到的解决方案有助于解决问题。

以上是关于BigQuery - 分组并使用数组字段作为过滤器的主要内容,如果未能解决你的问题,请参考以下文章

在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?

在将 Google BigQuery 作为源数据库的 Metabase 中使用字段过滤器时出现无法识别的名称

BigQuery - 基于字段/过滤器构建动态选择语句/查询

如何对 BigQuery 中的重复字段进行分组

bigquery row_number 根据特定字段按某些行分组

BigQuery LEFT JOIN 一个表并根据条件过滤其数组元素