如何在Postgresql中有一个字段取决于之前找到的行?

时间:2013-08-13 15:10:11

标签: sql database postgresql select

为了简单起见,我有一张像这样的库存进/出的表:

date,in_out
2013-08-05,+5
2013-08-07,-2
2013-08-12,-1

我想要做的是每个日期的库存商品数量:

date,in_out,quantity
2013-08-05,+5,5
2013-08-07,-2,3
2013-08-12,-1,2

但即使我通常很了解Postgresql,我也真的不知道如何编写一个可以考虑以前行的SELECT请求。

我会做的是这样的事情:

SELECT date,in_out, (stock_quant := stock_quant + in_out) AS quantity FROM table_stock;

任何建议都将不胜感激!

3 个答案:

答案 0 :(得分:1)

你正在寻找一笔运行金额:

select date,
       in_out,
       quantity,
       sum(quantity) over (order by date) as quantity
from  table_stock
order by date;

顺便说一下:date是一个可怕的名字。首先,它也是一个保留字,其次它没有记录列包含的内容。 “开始日期”,“结束日期”,“更改日期”,......

答案 1 :(得分:0)

试试这个:

SELECT date,in_out, stock_quant + in_out AS quantity 
FROM table_stock;

答案 2 :(得分:0)

很棒,我找到了Postgres 8.3及更早版本的解决方案:

CREATE OR REPLACE FUNCTION hds_csum_init() 
    RETURNS void 
    LANGUAGE plperl AS
$hds_csum_init$
    $_SHARED{csum} = 0;
$hds_csum_init$;

CREATE OR REPLACE FUNCTION hds_csum_sum(integer) 
    RETURNS integer
    LANGUAGE plperl AS
$hds_csum_sum$
    my $observation = shift;
    return $_SHARED{csum} += $observation;
$hds_csum_sum$;

然后:

SELECT hds_csum_init() ;
SELECT *, hds_csum_sum(in_out::integer) AS quantity FROM (SELECT * FROM table_stock);

它很棒!