1

複数行の配列を取り、結果の配列を返す関数を作成するには、それを知る必要があります。

例えば:

テーブル some_table

id | num_array
1  | [1,1,1]
2  | [2,2,2]

次に実行します:

SELECT custom_avg(num_array) FROM some_table;

そして、要素ごとの操作で配列を取得します (この例では avg):

[1.5, 1.5, 1.5]

行を操作する標準の集計関数のようなもの。

ドキュメントとグーグルを見てほぼ2時間後、これに対する明確な答えが見つかりません。

配列をテーブルに展開できることは知っていますが、それを避けようとしています。この種の関数が標準 SQL で解決できれば、それも有用です。

4

1 に答える 1

3

関数

Postgre 関数は、パラメーターとしてテーブル (「複数の行」) を取ることはできません。ドキュメントごと

引数の型は、ベース、複合、またはドメイン型にするか、テーブル列の型を参照できます。

カーソルまたは一時テーブルを使用して参照によってテーブルを渡します...

SQL

しかし、プレーン SQL でほとんどすべてを解決できます。1 次元配列列のすべての位置の平均を計算するには、次のようにします。

あなたはあなたのバージョンを提供していないので、現在のものを想定しています。WITH ORDINALITYPostgres 9.4が必要です:

SELECT ARRAY (
   SELECT avg(elem) AS avg_elem
   FROM   tbl t
        , unnest (t.num_array) WITH ORDINALITY a(elem, rn)
   GROUP  BY a.rn
   ORDER  BY a.rn
   ) AS arr_avg;

基本的:

  1. 結合内の各配列のネストを解除しLATERAL(ここでは暗示的)、要素の順序位置を記憶します
  2. GROUP BYこの位置。
  3. この位置で並べられた結果の配列を構築します。

古いバージョンには、あまり洗練されていない代替手段があります。Postgres 9.3の場合:

SELECT ARRAY (
   SELECT avg(t.num_array[i]) AS avg_elem
   FROM   tbl t, generate_subscripts(t.num_array, 1) i
   GROUP  BY i
   ORDER  BY i
   ) AS arr_avg;

SQL フィドル。

もっと:

于 2015-04-12T22:05:45.803 に答える