La tua funzione (semplificata!) potrebbe assomigliare a questa:
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;
Punti principali:
-
Nota che questo è
language SQL, quindi non una funzione PL/pgSQL. Potresti usarelanguage plpgsqlanche , ma qui non è necessario. -
Ho sostituito il nucleo del tuo voodoo con la funzione finestra
rank(), che dovrebbe fare esattamente lo stesso, solo più semplice. -
Ho anche rimosso del tutto la sottoquery. Non è necessario.
-
Il tipo
doublesi chiamadouble precisionin PostgreSQL. -
Per restituire più righe, definisci una funzione come
RETURNS SETOF recordoRETURNS TABLEcome ho fatto io. -
ORDER BYpuò utilizzare parametri posizionali, quindi non è necessario precisare nuovamente il calcolo della prima colonna:ORDER BY 1.
Tuttavia, più righe nello stessogrp. Aggiungi più colonne o espressioni aORDER BYclausola per arrivare a un ordinamento stabile.