presto/athena 中按元素聚合数组

ish*_*243 4 sql presto amazon-athena

我有一个表,其中有一array列。数组的大小保证所有行都相同。是否可以对数组进行按元素聚合以创建新数组?

例如,如果我的聚合是avg函数,那么:

Array 1: [1,3,4,5]
Array 2: [3,5,6,1]

Output:  [2,4,5,3]
Run Code Online (Sandbox Code Playgroud)

我想写这样的查询:

select
  timestamp_column,
  avg(array_column) as new_array
from 
  my_table
group by 
  timestamp_column
Run Code Online (Sandbox Code Playgroud)

该数组包含接近 200 个元素,因此我不希望对查询中的每个元素进行硬编码:)

Dai*_*rom 7

这可以通过组合 2 个鲜为人知的 SQL 结构来完成:UNNEST WITH ORDINALITY 和 array_agg 与 ORDER BY。

第一步是使用 将数组解包为行CROSS JOIN UNNEST(a) WITH ORDINALITY。对于每个数组中的每个元素,它将输出一行,其中包含元素值以及该元素在数组中的位置。

GROUP BY然后,您对序数和sum值使用标准。

最后,您使用 将总和重新组装回数组array_agg(value_sum ORDER BY ordinal)。该表达式的关键部分是调用ORDER BY中的子句array_agg。如果没有这个,值将是任意顺序。

这是一个完整的示例:

WITH t(a) AS (VALUES array [1, 3, 4, 5], array [3, 5, 6, 1])
SELECT array_agg(value_sum ORDER BY ordinal)
FROM (
    SELECT ordinal, sum(value) AS value_sum
    from t
             CROSS JOIN UNNEST(t.a) WITH ORDINALITY AS x(value, ordinal)
    GROUP BY ordinal);
Run Code Online (Sandbox Code Playgroud)