在我的工作中,我正在使用BigQuery中与此类似的表:

id | x | y

a | 1 | 2
a | 2 | 3
a | 3 | 4

b | 1 | 2
b | 2 | 3
b | 3 | 2

c | 3 | 2
c | 2 | 4
c | 3 | 4
...

我们想要获取此数据并执行以下转换:

对于每个唯一的id(例如a、b、c),我们希望将x和y值聚合到一个数组中.

例如,对于id a,我们将得到数组[1,2,3,2,3,4].

基本上,输出表应该如下所示:

id | array

a | [1,2,3,2,3,4]
b | [1,2,3,2,3,2]
c | [3,2,3,2,4,4]

我不确定如何在 bigquery 中只使用SQL/JS UDF来实现.

我只需要编写一个快速的Python脚本就可以做到这一点,但是考虑到我们有大量的ID,我们希望它是可伸缩的.

有没有办法只使用SQL/JS UDF来实现这一点.我的理解是,没有任何聚合函数可以跨列实现这一点.我说的对吗?

我在谷歌的 bigquery 文档中查找了用户定义的函数:https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions,但没有找到解决方案.

推荐答案

在前面的链接中没有提到的另一种 Select 是使用如下所示的数组连接运算符||.(但与@Mikhail的答案相似)

WITH sample_table AS (
  SELECT 'a' id, 1 x, 2 y UNION ALL
  SELECT 'a' id, 2 x, 3 y UNION ALL
  SELECT 'a' id, 3 x, 4 y UNION ALL
  SELECT 'b' id, 1 x, 2 y UNION ALL
  SELECT 'b' id, 2 x, 3 y UNION ALL
  SELECT 'b' id, 3 x, 2 y UNION ALL
  SELECT 'c' id, 3 x, 2 y UNION ALL
  SELECT 'c' id, 2 x, 4 y UNION ALL
  SELECT 'c' id, 3 x, 4 y
)
SELECT id, ARRAY_AGG(x) || ARRAY_AGG(y) AS `array`
  FROM sample_table
 GROUP BY 1;

-- from @Mikhail's answer
-- you will see different order of element in an array from above, but both have same set of elements.
SELECT id, ARRAY_CONCAT_AGG([x, y]) AS `array`
  FROM sample_table
 GROUP BY 1;

Query results

enter image description here

Sql相关问答推荐

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

SQL(PostgreSQL)从条件创建点表

在postgres中动态计算出现次数并插入到json中

如何在SQL中按每个子组的顺序更新数据?

Android房间fts4匹配语法AND OR

我希望以正确的升序获取SQL结果.怎样才能得到它们?

如何在postgres函数中插入后返回布尔值?

使用Kotlin Exposed SQL DSL Select 多个值并排序

查找表中特定值的上次更新日期

按日期时间(不包括秒)连接表

两个不同星期的销售额,不加成一行

SQL:查询作为子查询或CTE写入的最大和数失败

改进的SQL子字符串提取

日期逻辑(查找过go 90 天内的第一个匹配行)

Clickhouse:左连接表到外部数组

如何根据 SQL Server 中 1 条语句中 SELECT 的结果进行 INSERT 或 UPDATE

获取记录的上一个值,并将其与当前值一起显示

使用给定的变量对在循环中执行更新语句

SQL Server 分区和 Run Case 语句

为每组填写行以进行旋转