我有一堆大约 600k 行的所有者姓名 (varchar) 和宠物类型(也是 varchar)。对于每个主人的名字,我想要一个包含他们最常养的宠物的数组(如果他们有相同数量的相同宠物类型,则为宠物)。
一个例子:
*owner, pet type*
alice, cat
alice, dog
bob, fish
bob, cat
bob, fish
eve, cat
eve, dog
eve, cat
eve, dog
预期输出:
alice, [cat, dog]
bob, [fish]
eve, [cat, dog]
我的感觉是,这是内部查询中的“distinct on”与外部查询上的 array_agg 的某种组合,以进行数组聚合 - 但我就是无法正确理解。
最佳答案
您可以通过组合窗口函数和分组来做到这一点:
select owner, array_agg(pet order by pet)
from (
select owner, pet, dense_rank() over (partition by owner order by count(*) desc) as rnk
from pet
group by owner, pet
) t
where rnk = 1
group by owner
order by owner;
关于postgresql - 按结果获取组的所有模式的数组聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44313342/