如何从此数据集中创建组?

时间:2016-08-18 06:08:26

标签: postgresql aggregate-functions postgresql-9.2

我有一张表格如下:

   id    | similar_id|
 --------+-----------+
    1    |     2     |
    1    |     3     |
    2    |     1     |
    2    |     3     |
    3    |     1     |
    3    |     2     |
    4    |     5     |
    5    |     4     |

如何编写优化的sql查询,以便找到类似的组?
即,组1 - > {1,2,3},Group2 - > {4,5}

。请参阅,我知道数据可以更好地组织。

2 个答案:

答案 0 :(得分:1)

select distinct (
    select array_agg(a order by a)
    from unnest(a) a(a)
) as "group"
from (
    select id || array_agg(similar_id) a
    from t
    group by id
) s
order by 1
;
  group  
---------
 {1,2,3}
 {4,5}

从这些数据:

create table t (id int, similar_id int);
insert into t (id, similar_id) values
(1,2),
(1,3),
(2,1),
(2,3),
(3,1),
(3,2),
(4,5),
(5,4);

答案 1 :(得分:0)

简单的纯SQL:

SELECT DISTINCT groups
FROM (
  SELECT id, array_agg(similar_id) groups
  FROM (
    SELECT id, similar_id
    FROM grp
    UNION
    SELECT DISTINCT id, id
    FROM grp
    ORDER BY 1, 2) subsub
  GROUP BY 1) sub
ORDER BY 1;

这将产生:

 groups 
---------
 {1,2,3} 
 {4,5} 

这里的诀窍是使用UNION,使每个id与自身和similar_id配对,然后它只是一个聚合问题。< / p>