如何使用BigQuery UNNEST将结构体所有值展示在单行而非多行?
解决同一结构体键值对合并到单行的问题
你现在的查询用UNNEST(event_params)把每个参数拆成了单独的行,要把属于同一个事件的b和c参数合并到一行,咱们可以用条件聚合的方式来实现,不用交叉展开所有参数,这样就能把同一事件的多个参数值放在同一行里了。
优化后的查询语句
SELECT event_date, event_name, -- 获取key='b'对应的数值,转换为FLOAT64 MAX(CASE WHEN param.key = 'b' THEN CAST(param.value.string_value AS FLOAT64) END) AS b_value, -- 获取key='c'对应的数值,转换为FLOAT64 MAX(CASE WHEN param.key = 'c' THEN CAST(param.value.string_value AS FLOAT64) END) AS c_value FROM `project_name.dataset_name.table_name`, UNNEST(event_params) AS param WHERE event_name = 'a' AND param.key IN ('b', 'c') -- 仅筛选需要的参数,提升查询效率 -- 保留原有的条件判断逻辑:b值大于5,c值大于0 AND CASE WHEN param.key = 'b' THEN CAST(param.value.string_value AS FLOAT64) > 5 ELSE CAST(param.value.string_value AS FLOAT64) > 0 END GROUP BY event_date, event_name -- 按事件的日期和名称分组,合并同一事件的参数
关键思路说明
- 用
CASE语句配合聚合函数MAX(因为每个key在单个事件里通常只会有一个值,用MIN也能达到同样效果),把不同key的参数值映射到独立的列中。 - 通过
GROUP BY event_date, event_name确保同一事件的所有参数都被合并到同一行。 - 把原查询里的
param.key = 'b' or param.key = 'c'改成param.key IN ('b', 'c'),语法更简洁,执行效率一致。
如果你的场景中单个事件可能存在多个相同key的参数值,可以把MAX换成ARRAY_AGG,把多个值拼成数组存储,但从你的原查询逻辑来看,应该是每个key对应单个值,所以MAX是最适合的选择。
内容的提问来源于stack exchange,提问作者Mihran
相关产品推荐
相关产品推荐

