Ihre (vereinfachte!) Funktion könnte so aussehen:
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;
Hauptpunkte:
-
Beachten Sie, dass dies
language SQL
ist , also keine PL/pgSQL-Funktion. Sie könntenlanguage plpgsql
verwenden , aber das ist hier nicht nötig. -
Ich habe den Kern Ihres Voodoo durch die Fensterfunktion
rank()
, was genau dasselbe tun sollte, nur einfacher. -
Ich habe auch die Unterabfrage ganz entfernt. Es ist nicht notwendig.
-
Der Typ
double
heißtdouble precision
in PostgreSQL. -
Um mehrere Zeilen zurückzugeben, definieren Sie eine Funktion als
RETURNS SETOF record
oderRETURNS TABLE
wie ich. -
ORDER BY
kann Positionsparameter verwenden, sodass Sie die Berechnung der ersten Spalte nicht erneut buchstabieren müssen:ORDER BY 1
.
Allerdings mehrere Zeilen in derselbengrp
. Fügen Sie demORDER BY
weitere Spalten oder Ausdrücke hinzu -Klausel, um zu einer stabilen Sortierreihenfolge zu gelangen.