(簡略化された!)関数は次のようになります:
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
に列または式を追加します 安定したソート順に到達するための句。