簡體   English   中英

BigQuery SQL中的數組列和聚合:為什么值不是全部聚合的?

[英]Array column and aggregation in BigQuery SQL: Why the values are not all aggregated?

我在BigQuery中執行了下面的代碼

SELECT ( --inner query
         SELECT STRING_AGG(c) FROM t1.array_column c
       ) 
FROM (
        select 1 as f1, ['1','2','3'] as array_column
        union all
        select 2 as f1, ['5','6','7'] as array_column
) t1;

我期待類似的東西

Row|f0_
1  | 1,2,3,4,5,6,7

因為內部查詢中沒有GROUP BY 所以,我期待在所有線路上評估STRING_AGG

SELECT STRING_AGG(c) FROM t1.array_column c

相反,我得到這樣的東西:

Row|f0_
1  |1,2,3
2  |5,6,7

我有麻煩理解為什么我有這個結果

以下是BigQuery Standard SQL

#standardSQL
SELECT STRING_AGG((SELECT STRING_AGG(c) FROM t1.array_column c)) 
FROM (
  SELECT 1 AS f1, ['1','2','3'] AS array_column UNION ALL
  SELECT 2 AS f1, ['5','6','7'] AS array_column
) t1

並生產

Row f0_  
1   1,2,3,5,6,7    

注1:你幾乎就在那里 - 你只是缺少額外的STRING_AGG ,它會對每行中各自數組創建的字符串進行最后的分組

注意2:因為array_column屬於ARRAY類型,所以它被視為內部表,引用為t1.array_column ,因為 - FROM t1.array_column c相當於FROM UNNEST(array_column) c - 非常酷的hidden功能:o)

這是您的查詢:

SELECT (SELECT STRING_AGG(c) FROM t1.array_column c
       ) 
FROM (select 1 as f1, ['1', '2', '3'] as array_column
      union all
      select 2 as f1, ['5', '6', '7'] as array_column
     ) t1;

首先,我很驚訝它有效。 我以為你需要unnest()

SELECT (SELECT STRING_AGG(c) FROM UNNEST(t1.array_column) c
       ) 

怎么了? 好吧,如果你選擇f1 ,這將更加明顯。 然后你會得到:

1     1,2,3
2     5,6,7

這應該更清楚。 對於t1每一行(並且有兩行),您的代碼是:

  • 使用名為c的列將數組排除在行之外。
  • 將這些行重新聚合成一個字符串(沒有名稱)

如果要組合數組中的元素,請使用array_concat_agg()

SELECT array_concat_agg(array_column)
FROM (select 1 as f1, ['1','2','3'] as array_column
      union all
      select 2 as f1, ['5','6','7'] as array_column
     ) t1;

如果您希望將其表示為字符串而不是數組,請使用array_to_string()

SELECT array_to_string(array_concat_agg(array_column), ',')
FROM (select 1 as f1, ['1','2','3'] as array_column
      union all
      select 2 as f1, ['5','6','7'] as array_column
     ) t1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM