如何在postgresql中查找任何大小的数组的所有组合(子集)

时间:2014-10-25 08:34:36

标签: arrays postgresql combinations plpgsql

给定一个数组,如何在postgresql中查找特定大小的元素的所有组合(子集)。例如,给定数组[1,2,3,4],大小为3的所有组合将是

[1, 2, 3],
[1, 2, 4],
[1, 3, 4],
[2, 3, 4]

顺序在组合中并不重要,因此[1,2,3]和[3,2,1]被认为是相同的组合。

更新 必须在运行时将所需组合的大小指定为参数,以便可以使用相同的函数/查询来查找任何大小n< =数组大小的组合。 现有解决方案仅适用于大小为3的组合,并且每增加一个大小需要一个额外的交叉连接,这显然不切实际。

1 个答案:

答案 0 :(得分:3)

以下函数将所请求大小的所有组合生成为一组行,每行一个组合:

create or replace function get_combinations(source anyarray, size int) returns setof anyarray as $$
 with recursive combinations(combination, indices) as (
   select source[i:i], array[i] from generate_subscripts(source, 1) i
   union all
   select c.combination || source[j], c.indices || j
   from   combinations c, generate_subscripts(source, 1) j
   where  j > all(c.indices) and
          array_length(c.combination, 1) < size
 )
 select combination from combinations
 where  array_length(combination, 1) = size;
$$ language sql;

此函数在数组类型中是多态的。