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 plpgsql
også, 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
double
kaldesdouble precision
i PostgreSQL. -
For at returnere flere rækker skal du definere en funktion som
RETURNS SETOF record
ellerRETURNS TABLE
som jeg gjorde. -
ORDER BY
kan 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 BY
klausul for at nå frem til en stabil sorteringsrækkefølge.