假设我有下表
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
进行排序。
我认为该方法将涉及zip
或zip_with
,但我仍然坚持如何进行。
我认为在最新的Presto版本中,我应该能够利用array_sort
的第二个参数来构建对ROW
数组进行排序的方法,但是在我的版本(0.193)中不可用:
答案 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)