将列聚合为按另一列排序的数组

  • 本文关键字:一列 排序 数组 sql presto
  • 更新时间 :
  • 英文 :


假设我有下表

select * from (
  values ('A', 1, 7), ('A', 2, 4), ('A', 3, 3),
         ('B', 4, 6), ('B', 5, 5), ('A', 6, 2),
         ('C', 7, 9), ('C', 8, 8)
) example_table("id", "time", "value")

我想将value聚合到按id分组的array中,但数组应该按time顺序排列。

期望输出:

select * from (
  values ('A', array [2, 3, 4, 7]),
         ('B', array [5, 6]),
         ('C', array [8, 9])
) agg_table("id", "arr")

array_sort只允许我们按value排序。

我认为这种方法将涉及zipzip_with,但我被困在如何进行中。


我认为在最新的 Presto 版本中,我应该能够利用array_sort的第二个参数来构建一种对ROW数组进行排序的方法,但在我的版本 (0.193) 上,这不可用:

https://prestodb.io/docs/0.193/functions/array.html

您可以使用

array_agg(value ORDER BY time [ ASC | DESC ]),如下例所示。

不幸的是,我不知道此选项在 0.193 中是否可用。至少,这个答案有望对其他人有所帮助。

presto:tiny> with example_table as (
          ->     select * from (
          ->         values ('A', 1, 7), ('A', 2, 4), ('A', 3, 3),
          ->              ('B', 4, 6), ('B', 5, 5), ('A', 6, 2),
          ->              ('C', 7, 9), ('C', 8, 8)
          ->         ) example_table("id", "time", "value")
          -> )
          -> select array_agg(value order by time)
          -> from example_table
          -> group by id
          -> ;
    _col0
--------------
 [6, 5]
 [7, 4, 3, 2]
 [9, 8]
(3 rows)

相关内容

  • 没有找到相关文章

最新更新