Вашата (опростена!) функция може да изглежда така:
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;
Основни точки:
-
Имайте предвид, че това е
language SQL
, така че не е PL/pgSQL функция. Можете да използватеlanguage plpgsql
, но това не е необходимо тук. -
Замених ядрото на вашето вуду с прозоречната функция
rank()
, което трябва да прави точно същото, само по-просто. -
Също така премахнах напълно подзаявката. Не е необходимо.
-
Типът
double
се наричаdouble precision
в PostgreSQL. -
За да върнете няколко реда, дефинирайте функция като
RETURNS SETOF record
илиRETURNS TABLE
както направих аз. -
ORDER BY
може да използва позиционни параметри, така че не е необходимо да изписвате отново изчислението на първата колона:ORDER BY 1
.
Въпреки това, множество редове в един и същgrp
. Добавете още колони или изрази къмORDER BY
клауза за постигане на стабилен ред на сортиране.