sql - 如何按数组分组?

标签 sql postgresql

我有以下数据集:

id | object |
------------|
id1| object1|
id1| object2|
id1| object3|
id2| object1|
id2| object3|
id2| object4|
id3| object2|
id3| object3|
id3| object4|
id4| object1|
id4| object2|
id4| object3|
id5| object1| 
id5| object2|
id6| object1|
id6| object2|

我需要像这样使用“对象”列按重复数据数组分组:

object | count()
----------------
object1|   2   |<-from id1 and id4
object2|   2   |
object3|   2   |
----------------
object1|   2   |<-from id5 and id6
object2|   2   |
----------------
object1|   1   |<-from id2
object3|   1   |
object4|   1   |
----------------
object2|   1   |<-from id3
object3|   1   | 
object4|   1   |

如何按巧合数组对数据进行分组?

最佳答案

您似乎想要根据 ID 的一组公共(public)对象来识别 ID 组。在您的第一个组中,ID 1 和 4 与相同的三个对象 1、2 和 3 相关联。

要做到这一点,第一步是唯一标识每个组。在 postgresql 中,array_agg 解析(窗口)函数可用于执行此操作。一旦确定了组,您就可以计算相关 ID,如下所示和此 SQL Fiddle 中所示:

查询 1:

with grp as (
  select id
       , object
       , array_agg(object) 
         over (partition by id order by object
               rows between unbounded preceding
                        and unbounded following) objs
   from YourData
)
select min(id) first_id
     , object
     , count(id) cnt
  from grp
 group by objs, object
order by cnt desc, first_id, object

Results :

| first_id |  object | cnt |
|----------|---------|-----|
|      id1 | object1 |   2 |
|      id1 | object2 |   2 |
|      id1 | object3 |   2 |
|      id5 | object1 |   2 |
|      id5 | object2 |   2 |
|      id2 | object1 |   1 |
|      id2 | object3 |   1 |
|      id2 | object4 |   1 |
|      id3 | object2 |   1 |
|      id3 | object3 |   1 |
|      id3 | object4 |   1 |

关于sql - 如何按数组分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53874712/

相关文章:

sql - PostgreSQL WITH .. AS() 难点

ruby-on-rails - Rails Postgresql 数据库查询失败

ruby-on-rails - 将 HStore 列更改为数组

sql - PostgreSQL 仅选择日期与表中特定周数匹配的行

sql - SUM 3 个不同的 "CASE"列,具有三个不同的总数

php - 使用 MySQL 选择查询时出现问题

SQL:中断查询

mysql - 如何比较两个表并显示每个差异

mysql - 使用 MySQL 获取姓氏范围

java - 如何诊断野蝇10.1下降的原因