Presto:聚合所有列的数组

问题描述 投票:0回答:3

我有下表:

name   pets
Alex   [dog, cat, bird]
Tom    [rabbit, cat]
Mary   [snake, dog, fish, cow]
Dave   [dog]

我想知道是否可以创建一个查询来查找所有宠物。也就是说,我正在寻找类似的输出:

[dog, cat, bird, rabbit, snake, fish, cow]

目前的做法是将表导出为csv并使用python来解决。我想知道这是否可以直接在 Presto 查询中完成?谢谢!

sql arrays distinct presto trino
3个回答
5
投票

Presto 具有强大的数组功能。这应该有效:

select array_distinct(flatten(array_agg(pets))) all_pets
from mytable

基本上,这会将所有数组聚合在一起,作为数组的数组,然后将所有元素连接到一个数组中,最后删除重复项。


1
投票

扩展@GMB的答案,从可扩展性的角度来看这可以更加友好:

presto> SELECT array_agg(DISTINCT e)
     -> FROM (VALUES ARRAY[1,2,3], ARRAY[2,3,4]) t(a)
     -> CROSS JOIN UNNEST(a) AS u(e);
    _col0
--------------
 [3, 2, 4, 1]

这绝对是

array_distinct(flatten(array_agg(pets)))
的更详细版本,但避免在内存中实例化数组。

(理想情况下,Presto 优化器应该能够将一种转换为另一种,但目前还不是这样。)


0
投票

从 tbl_pets 中选择 set_union(pets) 作为 all_pets

这应该给出相同的结果

© www.soinside.com 2019 - 2024. All rights reserved.