Twoja (uproszczona!) funkcja może wyglądać tak:
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;
Główne punkty:
-
Zauważ, że jest to
language SQL
, a więc nie funkcja PL/pgSQL. Możesz użyćlanguage plpgsql
, ale tutaj nie jest to konieczne. -
Wymieniłem rdzeń twojego voodoo na funkcję okna
rank()
, który powinien zrobić dokładnie to samo, tylko prostsze. -
Całkowicie usunąłem też podzapytanie. Nie jest to konieczne.
-
Typ
double
nazywa siędouble precision
w PostgreSQL. -
Aby zwrócić wiele wierszy, zdefiniuj funkcję jako
RETURNS SETOF record
lubRETURNS TABLE
tak jak ja. -
ORDER BY
może używać parametrów pozycyjnych, więc nie musisz ponownie przeliterować obliczeń pierwszej kolumny:ORDER BY 1
.
Jednak wiele wierszy w tym samymgrp
. Dodaj więcej kolumn lub wyrażeń doORDER BY
klauzula, aby uzyskać stabilną kolejność sortowania.