PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come trovare tutte le combinazioni (sottoinsieme) di qualsiasi dimensione di un array in postgresql

La seguente funzione produce tutte le combinazioni della dimensione richiesta come un insieme di righe con una combinazione per riga:

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;

Questa funzione è polimorfica nel tipo di matrice.