You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:27:34