给定一个数组,如何在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的组合,并且每增加一个大小需要一个额外的交叉连接,这显然不切实际。
答案 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;
此函数在数组类型中是多态的。