假设我有下表
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
排序。
我认为这种方法将涉及zip
或zip_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)