我正在寻找一种对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函数一样将数据打包成某种结构的东西?
答案 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)]