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 precision
no PostgreSQL.
-
Para retornar várias linhas, defina uma função comoRETURNS SETOF record
ouRETURNS TABLE
como eu fiz.
-
ORDER BY
pode 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 BY
cláusula para chegar a uma ordem de classificação estável.