Din (förenklade!) funktion kan se ut så här:
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;
Huvudpunkter:
-
Observera att detta är
language SQL, alltså inte en PL/pgSQL-funktion. Du kan användalanguage plpgsqlockså, men det är inte nödvändigt här. -
Jag ersatte kärnan i ditt voodoo med fönsterfunktionen
rank(), som borde göra exakt samma sak, bara enklare. -
Jag tog också bort underfrågan helt och hållet. Det är inte nödvändigt.
-
Typen
doublekallasdouble precisioni PostgreSQL. -
För att returnera flera rader, definiera en funktion som
RETURNS SETOF recordellerRETURNS TABLEsom jag gjorde. -
ORDER BYkan använda positionsparametrar, så att du inte behöver skriva ut beräkningen av den första kolumnen igen:ORDER BY 1.
Men flera rader i sammagrp. Lägg till fler kolumner eller uttryck iORDER BYklausul för att komma fram till en stabil sorteringsordning.