Sua função (simplificada!) pode ficar assim:
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;
Pontos principais:
-
Observe que este élanguage SQL, portanto, não é uma função PL/pgSQL. Você pode usarlanguage plpgsql, também, mas isso não é necessário aqui.
-
Substituí o núcleo do seu voodoo pelo função de janelarank(), que deve fazer exatamente o mesmo, apenas mais simples.
-
Eu também removi a subconsulta completamente. Não é necessário.
-
O tipodoubleé chamado dedouble precisionno PostgreSQL.
-
Para retornar várias linhas, defina uma função comoRETURNS SETOF recordouRETURNS TABLEcomo eu fiz.
-
ORDER BYpode usar parâmetros posicionais, então você não precisa soletrar o cálculo da primeira coluna novamente:ORDER BY 1.
No entanto, várias linhas no mesmogrp. Adicione mais colunas ou expressões aoORDER BYcláusula para chegar a uma ordem de classificação estável.