1

このように、列が実数の配列であるテーブルがあります

   my_column
-----------------
{5.7, 1.5, 1.7, ...}
{4.2, 4.1, 2.6, ...}
etc

そして、各要素が行の下の対応する要素の合計である合計の集計配列を生成したい-このようなもの

   my_column_aggregate
--------------------------------------------------------
{sum(5.7,4.2, etc), sum(1.5,4.1,etc), sum(1.7,2.6,etc) ...}

私のテーブルには、そのような列がいくつかあり、約 10 ~ 100 の順序付けられていない行があり、各配列には同じ数 (約 20) の順序付けられた要素があります。概念的には、テーブルは行列であり、もちろん他の配置を使用して格納することもできましたが、他の理由により、おそらくそのままの状態のままです。

my_agg_sum()たとえば、関数を書く必要があるので、

SELECT my_agg_sum (my_column) FROM ... WHERE ...

いくつかの調査を行った後、最終的にはR http://www.r-project.org/と PL/R http://www.joeconway.com/plr/をインストールして使用する必要があると思います。やるべき複雑な数の計算。

しかし、それまでの間、私の現在のニーズはシンプルであり、集計関数の作成の基本を学びたいので、助けが必要です。組み込み関数array_agg()を使用して配列の配列 (行列) を収集し、そのために加算関数を記述できると考えました。(私は PL/pgSQL に非常に慣れていないため、このhttp://ledgersmbdev.blogspot.ca/2013/04/introduction-to-postgresql-arrays-basic.htmlをサンプル ガイドとして使用します。)中間結果を得ることができます

{{5.7, 1.5, 1.7, ...}, {4.2, 4.1, 2.6, ...}, etc}

私は大丈夫だと思います。問題は、私が試したときです

SELECT array_agg (my_column)

私は得る

ERROR:  could not find array type for data type real[]

2D配列はサポートされていますが、配列の配列は直接サポートされていないようです!

http://postgresql.1045698.n5.nabble.com/could-not-find-array-type-for-data-type-character-varying-td1879264.htmlの応答がよくわかりませんでした

新しいタイプを作成する必要があるかもしれません

CREATE TYPE profile AS (a_name REAL[])

そして何?それとも、ネストされたunnest()ing またはarray_to_string()ing を大量に実行する必要があるのでしょうか...?

どういうわけか、各配列要素を反復処理できました

SELECT  sum (my_column[i])

i の場合、1 から n ですが、どのように?

4

1 に答える 1

2

CREATE AGGREGATEこれについては非常に簡単なステートメントを書くことができます。この同様の以前の投稿を参照してください。

これはあまり効率的ではないため、PL/R の方がはるかに優れたオプションになります。または、勇気がある場合は C で集計を作成します。C の PostgreSQL 配列 API はかなり醜いです。

于 2013-09-20T18:51:38.277 に答える