如何在Presto SQL中将列转换为数组
在Presto SQL中实现列转数组的方法
在Presto里实现你Postgres示例中的列转数组功能,最常用也最简洁的方式是使用**array_agg()**聚合函数,它的作用就是将指定列的所有值收集成一个数组。
对应你示例的改写查询
直接把Postgres的写法替换成array_agg()即可,效果完全一致:
WITH dataset AS ( SELECT '1' as a UNION SELECT '2' as a UNION SELECT '3' as a ) SELECT array_agg(a) AS array_result;
这个查询返回的结果和你Postgres示例类似(注意:UNION本身不保证顺序,如果需要固定数组内元素的顺序,可以在array_agg里加上ORDER BY):
| array_result |
|---|
| ['1','2','3'] |
进阶:指定数组元素顺序
如果希望数组里的元素按特定顺序排列,可以在array_agg中添加排序逻辑:
WITH dataset AS ( SELECT '1' as a UNION SELECT '2' as a UNION SELECT '3' as a ) SELECT array_agg(a ORDER BY a DESC) AS array_result;
返回结果会是:['3','2','1']
和Postgres写法的对比
Postgres里的array(select a from dataset)是通过子查询构造数组的语法,而Presto中没有完全一致的语法,但array_agg()是语义等价的标准实现,而且在分组场景下更灵活——比如如果需要按某个字段分组,再将另一列转成数组,array_agg()可以直接配合GROUP BY使用:
WITH orders AS ( SELECT 'user1' AS user_id, 'order1' AS order_id UNION SELECT 'user1' AS user_id, 'order2' AS order_id UNION SELECT 'user2' AS user_id, 'order3' AS order_id ) SELECT user_id, array_agg(order_id) AS user_orders FROM orders GROUP BY user_id;
这个查询会返回每个用户对应的所有订单ID数组。
内容的提问来源于stack exchange,提问作者Dmytro Serdiuk
相关产品推荐
相关产品推荐

