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 SQL
is , 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
double
heetdouble precision
in PostgreSQL. -
Om meerdere rijen te retourneren, definieert u een functie als
RETURNS SETOF record
ofRETURNS TABLE
zoals ik deed. -
ORDER BY
kan 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 BY
clausule om tot een stabiele sorteervolgorde te komen.