Hàm (được đơn giản hóa!) Của bạn có thể trông giống như sau:
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;
Những điểm chính:
-
Lưu ý rằng đây là
language SQL
, vì vậy không phải là một hàm PL / pgSQL. Bạn có thể sử dụnglanguage plpgsql
, nhưng điều đó không cần thiết ở đây. -
Tôi đã thay thế cốt lõi của voodoo của bạn bằng chức năng cửa sổ
rank()
, điều này sẽ thực hiện tương tự chính xác, chỉ đơn giản hơn. -
Tôi cũng đã xóa hoàn toàn truy vấn con. Nó không cần thiết.
-
Loại
double
được gọi làdouble precision
trong PostgreSQL. -
Để trả về nhiều hàng, hãy xác định một hàm dưới dạng bản ghi
RETURNS SETOF record
hoặcRETURNS TABLE
như tôi đã làm. -
ORDER BY
có thể sử dụng các tham số vị trí, vì vậy bạn không phải viết lại phép tính của cột đầu tiên:ORDER BY 1
.
Tuy nhiên, nhiều hàng trong cùng mộtgrp
. Thêm các cột hoặc biểu thức khác vàoORDER BY
mệnh đề để đạt được thứ tự sắp xếp ổn định.