Vaše (zjednodušeně!) funkce by mohla vypadat takto:
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;
Hlavní body:
-
Upozorňujeme, že toto je
language SQL
, takže ne funkce PL/pgSQL. Můžete použítlanguage plpgsql
, ale to zde není nutné. -
Jádro vašeho voodoo jsem nahradil funkce okna
rank()
, který by měl dělat totéž, jen jednodušší. -
Poddotaz jsem také úplně odstranil. Není to nutné.
-
Typ
double
se nazývádouble precision
v PostgreSQL. -
Chcete-li vrátit více řádků, definujte funkci jako
RETURNS SETOF record
neboRETURNS TABLE
jako já. -
ORDER BY
může používat poziční parametry, takže nemusíte znovu vypisovat výpočet prvního sloupce:ORDER BY 1
.
Nicméně více řádků ve stejnémgrp
. Přidejte další sloupce nebo výrazy doORDER BY
klauzule k dosažení stabilního pořadí řazení.