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 plpgsql
anche , 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
double
si chiamadouble precision
in PostgreSQL. -
Per restituire più righe, definisci una funzione come
RETURNS SETOF record
oRETURNS TABLE
come ho fatto io. -
ORDER BY
può 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 BY
clausola per arrivare a un ordinamento stabile.