BigQuery - 将 unnest 与 array_agg 一起使用

Posted

技术标签:

【中文标题】BigQuery - 将 unnest 与 array_agg 一起使用【英文标题】:BigQuery - using unnest with array_agg 【发布时间】:2018-01-01 07:18:53 【问题描述】:

我正在尝试对一组聚合数据进行一些计算。使用 SQL 函数时,它正在工作:

CREATE TEMPORARY FUNCTION uniq_sum(cls array<struct<word string,word_count int64>>) AS (
  (select sum(word_count) from (select row_number() over (partition by word) r,word_count from unnest(cls)) where r=1)
);

select 
  corpus,
  uniq_sum(array_agg(struct(word,word_count))) res
  from `bigquery-public-data.samples.shakespeare` 
  group by corpus

当我尝试内联运行时,我收到一个错误:UNNEST 中不允许聚合函数 ARRAY_AGG。

是否可以在 array_agg 创建的数组上运行内联计算? 在这种情况下,我正在尝试运行 sum(distinct) 的某个版本,其中不同的键被某个字符串元素接管(因此对于许多单词对 word_count 我想运行 sum(word_count),并且只对一个元素求和每个字)。

select 
  corpus,
  (select sum(word_count) from (select row_number() over (partition by word) r,word_count from unnest(array_agg(struct(word,word_count))) where r=1))
  from `bigquery-public-data.samples.shakespeare` 
  group by corpus

【问题讨论】:

【参考方案1】:

下面的简单查询返回的结果与你的完全相同 - 所以看起来你把事情复杂化了

#standardSQL
SELECT 
  corpus,
  SUM(word_count) res
FROM `bigquery-public-data.samples.shakespeare` 
GROUP BY corpus  

同时,正式地,以下是您所要求的内联版本

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

新年快乐! :o)

【讨论】:

是否可以在没有子查询的情况下编写第二个查询?如 - 在 ARRAY_AGG(STRUCT(word,word_count)) 上运行的标量子查询,例如:(select sum(x) from unnest(array_agg(STRUCT(word,word_count))) where... 不幸的是Aggregate function ARRAY_AGG not allowed in UNNEST所以你不能一次完成

以上是关于BigQuery - 将 unnest 与 array_agg 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

在 BIGQUERY 上使用 UNNEST 左连接

BigQuery:使用 UNNEST 检查数组的内容

UNNEST(hit.eCommerceAction),谷歌 Bigquery

Google Bigquery 外部加入 UNNEST

一次选择中的 Bigquery 多个 unnest

Bigquery unnest 最小行数