Uw (vereenvoudigde!) functie kan er als volgt uitzien:
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;
Belangrijkste punten:
-
Merk op dat dit
language SQLis , dus geen PL/pgSQL-functie. Je zoulanguage plpgsql. kunnen gebruiken , ook, maar dat is hier niet nodig. -
Ik heb de kern van je voodoo vervangen door de vensterfunctie
rank(), die precies hetzelfde zou moeten doen, alleen eenvoudiger. -
Ik heb de subquery ook helemaal verwijderd. Het is niet nodig.
-
Het type
doubleheetdouble precisionin PostgreSQL. -
Om meerdere rijen te retourneren, definieert u een functie als
RETURNS SETOF recordofRETURNS TABLEzoals ik deed. -
ORDER BYkan positionele parameters gebruiken, zodat u de berekening van de eerste kolom niet opnieuw hoeft te spellen:ORDER BY 1.
Echter, meerdere rijen in dezelfdegrp. Voeg meer kolommen of uitdrukkingen toe aan deORDER BYclausule om tot een stabiele sorteervolgorde te komen.