Din (forenklede!) funktion kunne se sådan ud:
CREATE OR REPLACE FUNCTION my_custom_grouping(integer)
RETURNS TABLE (
grp integer,
col1 double precision,
col2 double precision,
col3 double precision,
col4 double precision,
col5 double precision,
col6 double precision,
col7 double precision) AS
$BODY$
SELECT ceil(rank() OVER (ORDER BY col1) / $1)::int as grp
,col1, col2, col3, col4, col5, col6, col7
FROM mytable
ORDER BY 1;
$BODY$ LANGUAGE SQL;
Vigtigste punkter:
-
Bemærk, at dette er
language SQL, så ikke en PL/pgSQL-funktion. Du kan brugelanguage plpgsqlogså, men det er ikke nødvendigt her. -
Jeg erstattede kernen af dit voodoo med vinduefunktionen
rank(), som burde gøre præcis det samme, bare enklere. -
Jeg fjernede også underforespørgslen helt. Det er ikke nødvendigt.
-
Typen
doublekaldesdouble precisioni PostgreSQL. -
For at returnere flere rækker skal du definere en funktion som
RETURNS SETOF recordellerRETURNS TABLEsom jeg gjorde. -
ORDER BYkan bruge positionsparametre, så du ikke behøver at stave beregningen af den første kolonne igen:ORDER BY 1.
Men flere rækker i sammegrp. Tilføj flere kolonner eller udtryk tilORDER BYklausul for at nå frem til en stabil sorteringsrækkefølge.