postgresql - 按结果获取组的所有模式的数组聚合

标签 postgresql

我有一堆大约 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;

在线示例:http://rextester.com/MTFIQ24341

关于postgresql - 按结果获取组的所有模式的数组聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44313342/

相关文章:

sql - 得到一个不同的行及其值

postgresql - 为什么我的Flask服务器无法使用docker-compose与postgres数据库对话?

sql - 如何修复 AWS Athena 的 SQL

database - PostgreSQL 覆盖继承的列

postgresql - Heroku - PostgreSQL - 如何在 Windows 上远程连接

sql - 如何为postgresql中的特定部分设置条件?

sql - 我什么时候应该在 postgresql 中使用 fetch 关键字

postgresql - 在 Slick 中,有一种方法可以在不使用特定 JDBC 驱动程序的情况下声明表

postgresql - 在 Postgres 中查找多个字符串并替换为单个字符串

sql - PostgreSQL 查询计划中缺少表访问