2012-03-21 26 views
0

我正在使用PostgreSQL 8.2,這是我問這個問題的主要原因。我想在這個版本的PostgreSQL中得到一個列(讓它命名爲C),並且對於其他一些預先定義的列(讓它命名爲B)的累積最小值。因此,在列C的第n行中,對於某些排序,應該是行1至n中B的最小值。早期版本的PostgreSQL的累積分鐘

在示例列A列出了秩序和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已經到期。沒有更多的安全更新。還有很多缺失的功能...