Su función (¡simplificada!) podría verse así:
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;
Puntos principales:
-
Tenga en cuenta que esto es
language SQL
, por lo que no es una función PL/pgSQL. Podrías usarlanguage plpgsql
, también, pero eso no es necesario aquí. -
Reemplacé el núcleo de tu vudú con la función de ventana
rank()
, que debería hacer exactamente lo mismo, solo que más simple. -
También eliminé la subconsulta por completo. No es necesario.
-
El tipo
double
se llamadouble precision
en PostgreSQL. -
Para devolver varias filas, defina una función como
RETURNS SETOF record
oRETURNS TABLE
como yo lo hice. -
ORDER BY
puede usar parámetros posicionales, por lo que no tiene que volver a deletrear el cálculo de la primera columna:ORDER BY 1
.
Sin embargo, múltiples filas en el mismogrp
. Agregue más columnas o expresiones alORDER BY
cláusula para llegar a un orden de clasificación estable.