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

时间:2019-01-18 04:18:07

标签: 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聚合到一个由array分组的id中,但是该数组应按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

1 个答案:

答案 0 :(得分:0)

您可以使用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)