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

BigQuery中能否对ARRAY_AGG生成的数组执行内联计算?

解决BigQuery中内联处理ARRAY_AGG数组去重求和的问题

首先,你遇到的错误是因为BigQuery的执行逻辑限制:聚合函数(比如ARRAY_AGG)不能直接嵌套在UNNEST中使用。这是因为ARRAY_AGG是在GROUP BY阶段完成计算的,而你尝试的内联子查询里的UNNEST在逻辑执行顺序上早于GROUP BY的聚合操作,导致引擎无法解析这种嵌套引用。

不过我们有几种方法可以实现你要的「按word去重后求和word_count」的逻辑,不需要临时函数也能内联完成:

方法一:先标记去重再聚合(推荐,性能更优)

这种方法直接在分组前用窗口函数标记每个corpus下的唯一word,然后只保留首次出现的行再求和,完全不需要数组操作:

SELECT corpus, SUM(word_count) AS res
FROM (
  SELECT 
    corpus, 
    word, 
    word_count,
    -- 给每个corpus下的word标记行号,首次出现的行号为1
    ROW_NUMBER() OVER (PARTITION BY corpus, word) AS rn
  FROM `bigquery-public-data.samples.shakespeare`
)
WHERE rn = 1
GROUP BY corpus

方法二:用WITH子句拆分聚合与展开逻辑

如果你更倾向于类似临时函数的数组处理思路,可以先用WITH子句完成数组聚合,再在主查询中展开数组去重求和,这样就避开了嵌套聚合的问题:

WITH aggregated_corpus AS (
  SELECT 
    corpus, 
    ARRAY_AGG(STRUCT(word, word_count)) AS word_list
  FROM `bigquery-public-data.samples.shakespeare`
  GROUP BY corpus
)
SELECT 
  corpus,
  (
    SELECT SUM(word_count) 
    FROM (
      SELECT 
        word, 
        word_count,
        ROW_NUMBER() OVER (PARTITION BY word) AS rn
      FROM UNNEST(word_list)
    ) 
    WHERE rn = 1
  ) AS res
FROM aggregated_corpus

补充说明

你的临时函数能运行,是因为它把数组作为参数传入,函数内部的UNNEST处理的是已经聚合完成的数组,而不是在聚合过程中直接引用未完成的ARRAY_AGG结果,这就避开了执行顺序的冲突。

内容的提问来源于stack exchange,提问作者Lior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:39