Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在此数据集中创建组?_Postgresql_Aggregate Functions_Postgresql 9.2 - Fatal编程技术网

Postgresql 如何在此数据集中创建组?

Postgresql 如何在此数据集中创建组?,postgresql,aggregate-functions,postgresql-9.2,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查

我的表格如下:

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


另外,我知道数据本来可以组织得更好

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);
简单普通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} 

这里的诀窍是使用
联合
,这样每个
id
都与自身配对,并且它是
相似的\u id
s,然后它只是一个聚合问题。

如果表中也包含行:(5,1),那么结果应该是什么,假设表中不包含这样的条目。我认为您的问题需要一个复杂的算法,并且不能用唯一的(即使复杂的)SQL查询来解决。