我正在使用 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)。这种方法效率不高,虽然它在较小的表上运行良好,但由于我需要在较大的表上使用它,它几乎无法使用。
所以我非常感谢任何有关此问题的替代,更有效解决方案的建议。
谢谢!
答案 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已于去年达到使用寿命。没有更多的安全更新。还有很多缺失的功能...