2012-03-21 8 views
0

私はPostgreSQL 8.2を使用しています。これが私がこの質問をしている主な理由です。私はPostgreSQLのこのバージョンでは、他のいくつかの先行カラム(Bという名前をつけてください)の累積最小値を持つカラム(名前をCにします)にしたいと思います。従って、列Cのn番目の行は、ある順序付けのために行1からnのBの値の最小値でなければならない。列A以下の例ではPostgreSQLの以前のバージョンの累積最小値

は順序と列を与えるCの順で列Bの累積最小値が含まれています:私が欲しいものを説明するため

A B  C 
------------ 
1 5  5  
2 4  4 
3 6  4 
4 5  4 
5 3  3 
6 1  1 

おそらく最も簡単な方法は、それ以降のバージョンでは、次のクエリが何をするか、です

SELECT A , B, min (B) OVER(ORDER BY A) C FROM T; 

しかし、バージョン8.2にはもちろんウィンドウ機能はありません。

私は配列でこれを行ういくつかのplpgsql関数を書いています。しかし、これを使用するには、array_agg集計関数を使用しなければなりません(そのバージョンにはarray_aggが組み込まれていません)。このアプローチはあまり効率的ではありません。小さいテーブルでうまくいきましたが、大きなテーブルで使う必要がありました。

この問題の代わりとなる、より効率的な解決策の提案には非常に感謝します。

ありがとうございました!

答えて

1

さて、あなたはこの単純な副選択使用することができます。

SELECT a, b, (SELECT min(b) FROM t t1 WHERE t1.a <= t.a) AS c 
FROM t 
ORDER BY a; 

をしかし、私は、それはより速く、大きなテーブルに対するplpgsqlが機能よりもないだろう。たぶんあなたの機能を私たちに示すことができます。そこには改善の余地があるかもしれません。

CREATE INDEX t_a_b_idx ON t (a,b); 

しかし、実際に、あなたは、PostgreSQLの最新バージョンにアップグレードする必要があります。これは、高速あなたのようなマルチカラムインデックスを持つべきであるためには

。バージョン8.2は昨年末に終了しました。これ以上のセキュリティアップデートはありません。そして多くの欠けている機能...