BigQuery - 对array_agg使用unexst

时间:2018-01-01 07:18:53

标签: google-bigquery

我正在尝试对一组聚合数据进行一些计算。当使用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),其中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 个答案:

答案 0 :(得分:3)

下面的简单查询会返回与您完全相同的结果 - 所以看起来像是过于复杂的事情

   
#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)