我有以下数据集:
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/