Postgres重叠一列的数组

时间:2016-06-09 03:20:15

标签: postgresql

我有一个表“A”,其中一列是“col1”,其中每个记录都是一个整数数组。

col1
-----
{1,2,3,4}
{1,2,6,7}
{1,2,3,8,9}

我喜欢有一行作为结果,其中包含“col1”中所有数组的重叠或交叉。

select overlap(col1) from A;

result
-----
{1,2}

1 个答案:

答案 0 :(得分:6)

您应该为此目的定义自定义聚合:

CREATE OR REPLACE FUNCTION public.overlap_array_aggregate(anyarray, anyarray)
 RETURNS anyarray
 LANGUAGE plpgsql STRICT
AS $function$
BEGIN
  RETURN ARRAY(SELECT unnest($1) INTERSECT SELECT unnest($2));
END;
$function$

CREATE AGGREGATE array_overlap_agg (
   basetype = anyarray,
   sfunc =  overlap_array_aggregate,
   stype = anyarray );

然后它按预期工作:

postgres=# SELECT * FROM foo;
┌─────────────┐
│      a      │
╞═════════════╡
│ {1,2,3,4}   │
│ {1,2,6,7}   │
│ {1,2,3,8,9} │
└─────────────┘
(3 rows)

postgres=# SELECT array_overlap_agg(a) FROM foo;
┌───────────────────┐
│ array_overlap_agg │
╞═══════════════════╡
│ {1,2}             │
└───────────────────┘
(1 row)