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 plpgsql
också, 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
double
kallasdouble precision
i PostgreSQL. -
För att returnera flera rader, definiera en funktion som
RETURNS SETOF record
ellerRETURNS TABLE
som jag gjorde. -
ORDER BY
kan 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 BY
klausul för att komma fram till en stabil sorteringsordning.