Votre fonction (simplifiée !) pourrait ressembler à ceci :
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;
Points majeurs :
-
Notez qu'il s'agit du
language SQL
, donc pas une fonction PL/pgSQL. Vous pouvez utiliserlanguage plpgsql
, aussi, mais ce n'est pas nécessaire ici. -
J'ai remplacé le noyau de votre vaudou par la fonction de fenêtre
rank()
, qui devrait faire exactement la même chose, juste plus simple. -
J'ai également supprimé complètement la sous-requête. Ce n'est pas nécessaire.
-
Le type
double
est appelédouble precision
dans PostgreSQL. -
Pour renvoyer plusieurs lignes, définissez une fonction comme
RETURNS SETOF record
ouRETURNS TABLE
comme je l'ai fait. -
ORDER BY
peut utiliser des paramètres de position, vous n'avez donc pas à épeler à nouveau le calcul de la première colonne :ORDER BY 1
.
Toutefois, plusieurs lignes dans le mêmegrp
. Ajouter plus de colonnes ou d'expressions auORDER BY
clause pour arriver à un ordre de tri stable.