早期版本的PostgreSQL累积最小值

时间:2012-03-21 22:46:15

标签: postgresql

我正在使用 PostgreSQL 8.2 ,这是我提出这个问题的主要原因。我想在这个版本的PostgreSQL中添加一个列(让它命名为C),其中包含一些其他预订列的累积最小值(让它命名为B)。因此,对于某些排序,第C行的第n行应该是第1行到第n行中B的最小值。

在下面的示例中,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 个答案:

答案 0 :(得分: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已于去年达到使用寿命。没有更多的安全更新。还有很多缺失的功能...