PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So finden Sie alle Kombinationen (Teilmengen) beliebiger Größe eines Arrays in Postgresql

Die folgende Funktion erzeugt alle Kombinationen der angeforderten Größe als Reihe von Zeilen mit einer Kombination pro Zeile:

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;

Diese Funktion ist im Array-Typ polymorph.