【问题标题】:Aggregate arrays element-wise in presto/athena在 presto/athena 中按元素聚合数组
【发布时间】:2020-12-30 09:02:07
【问题描述】:

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

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

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

Output:  [2,4,5,3]

我想写这样的查询:

select
  timestamp_column,
  avg(array_column) as new_array
from 
  my_table
group by 
  timestamp_column

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

【问题讨论】:

    标签: sql presto amazon-athena


    【解决方案1】:

    这可以通过结合 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) 将总和重新组合回一个数组。这个表达式的关键部分是array_agg 调用中的ORDER BY 子句。如果没有这个,值将是任意顺序。

    这是一个完整的例子:

    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);
    

    【讨论】:

    • 我想我读过这两个函数,但无法将 2 和 2 放在一起。谢谢!
    • 这有一个问题。 Athena 不支持 order by:docs.aws.amazon.com/athena/latest/ug/…
    • 有没有人设法找到真正适用于 Athena 的变体?
    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2019-12-16
    • 2019-05-13
    • 2019-11-25
    • 2021-02-10
    • 2019-10-31
    相关资源
    最近更新 更多