BigQuery函数可将行数据折叠为JSON或结构

时间:2018-08-17 13:12:00

标签: google-bigquery

我正在寻找一种对BigQuery中的多个列进行分组的方法,但要保持更多的细节,否则可能会聚合行。

数据:

ID     A        B        C       D  
2      1        2        3       4
2      2        3        4       5 
1      1        2        1       3

查询内容如下:

SELECT id, TAKE_ANY(a), sum(b), count(d), max(d), MAGIC(a,b,c,d) FROM table GROUP BY 1

我想要的输出是这样的:

1, 1, 2, 1, 3, [ (1,2,1,3)]
2, 2, 5, 2, 5, [ (1,2,3,4), (2,3,4,5) ]

是否存在像MAGIC函数一样将数据打包成某种结构的东西?

2 个答案:

答案 0 :(得分:0)

在选择列表中,将ARRAY_AGG与STRUCT函数一起使用。例如,

SELECT id, ARRAY_AGG(STRUCT(a, b, c, d))
FROM table
GROUP BY id

这将返回一个数组,其中包含每个组的那些列的所有值。

答案 1 :(得分:0)

下面的选项(对于BigQuery Standard SQL)适用于[ (1,2,3,4), (2,3,4,5) ]的情况,您实际上是指STRING与STRUCT的数组(从问题上不是很清楚,但我认为可能)

#standardSQL
SELECT 
  id, 
  ANY_VALUE(a) any_a, 
  SUM(b) sum_b, 
  COUNT(d) count_d, 
  MAX(d) max_d, 
  FORMAT('[%s]', STRING_AGG(FORMAT('(%i,%i,%i,%i)', a, b, c, d), ',')) a_b_c_d
FROM `project.dataset.table` 
GROUP BY id

如果适用于您的问题中的伪数据,如下所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 2 id, 1 a, 2 b, 3 c, 4 d UNION ALL
  SELECT 2, 2, 3, 4, 5 UNION ALL 
  SELECT 1, 1, 2, 1, 3 
)
SELECT 
  id, 
  ANY_VALUE(a) any_a, 
  SUM(b) sum_b, 
  COUNT(d) count_d, 
  MAX(d) max_d, 
  FORMAT('[%s]', STRING_AGG(FORMAT('(%i,%i,%i,%i)', a, b, c, d), ',')) a_b_c_d
FROM `project.dataset.table` 
GROUP BY id
ORDER BY id   

结果将是

Row id  any_a   sum_b   count_d max_d   a_b_c_d  
1   1   1       2       1       3       [(1,2,1,3)]  
2   2   1       5       2       5       [(1,2,3,4),(2,3,4,5)]