0

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

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;

任何建议将不胜感激!

4

3 回答 3

1

您正在寻找一个运行总和:

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

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

于 2013-08-13T15:12:48.540 回答
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);

而且效果很好!

于 2013-08-13T16:52:33.663 回答
0

尝试这个 :

SELECT date,in_out, stock_quant + in_out AS quantity 
FROM table_stock;
于 2013-08-13T15:12:34.130 回答