sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo encontrar todas las combinaciones (subconjunto) de cualquier tamaño de una matriz en postgresql

La siguiente función produce todas las combinaciones del tamaño solicitado como un conjunto de filas con una combinación por fila:

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;

Esta función es polimórfica en el tipo de matriz.