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