为了简单起见,我有一张像这样的库存进/出的表:
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;
任何建议都将不胜感激!
答案 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);
它很棒!