Fungsi Anda (disederhanakan!) dapat terlihat seperti ini:
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;
Poin utama:
-
Perhatikan bahwa ini adalah
language SQL
, jadi bukan fungsi PL/pgSQL. Anda bisa menggunakanlanguage plpgsql
, juga, tapi itu tidak perlu di sini. -
Saya mengganti inti voodoo Anda dengan fungsi jendela
rank()
, yang seharusnya melakukan hal yang sama persis, hanya saja lebih sederhana. -
Saya juga menghapus subquery sama sekali. Itu tidak perlu.
-
Jenis
double
disebutdouble precision
di PostgreSQL. -
Untuk mengembalikan beberapa baris, tentukan fungsi sebagai
RETURNS SETOF record
atauRETURNS TABLE
seperti yang saya lakukan. -
ORDER BY
dapat menggunakan parameter posisi, sehingga Anda tidak perlu lagi mengeja perhitungan kolom pertama:ORDER BY 1
.
Namun, beberapa baris dalamgrp
yang sama . Tambahkan lebih banyak kolom atau ekspresi keORDER BY
klausa untuk sampai pada urutan pengurutan yang stabil.