2014-10-25 4 views
1

Учитывая массив, как найти все комбинации (подмножества) элементов определенного размера в postgresql. Например, если массив [1, 2, 3, 4] все комбинации размера 3 будетКак найти все комбинации (подмножество) любого размера массива в postgresql

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

заказ не имеет значения в комбинациях и, следовательно, [1, 2, 3] и [3, 2, 1] считаются одной и той же комбинацией.

Обновление: Размер комбинаций, необходимых должны быть указаны во время выполнения в качестве параметра, так что та же функция/запрос может быть использован, чтобы найти комбинации любого размера п < = размер массива. Существующее решение работает только для комбинаций размера 3 и требует дополнительного кросс-соединения для каждого увеличения размера, что явно нецелесообразно.

ответ

1

Следующая функция производит все комбинации требуемого размера в виде набора строк с одной комбинацией в строку:

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; 

Эта функция является полиморфной в типе массива.

Смежные вопросы