对动态行postgresql使用lag()

时间:2017-05-27 01:17:24

标签: sql postgresql

我有一张名为'数量'如下

表1:

----------------------------------------------------
Price | A_Quantity | B_Quantity | Remaining_quantity
----------------------------------------------------
30    | 17         | 2          | 0    
32    | 17         | 4          | 0    
33    | 17         | 4          | 0
----------------------------------------------------

我希望字段 - Remaining_quantity填写如下

表2:

----------------------------------------------------
Price | A_Quantity | B_Quantity | Remaining_quantity
----------------------------------------------------
30    | 17         | 2          | 15    
32    | 17         | 4          | 11
33    | 17         | 4          | 7
----------------------------------------------------

我使用了以下查询,但它没有给出预期的结果。

update quantity set remaining_quantity = remaining_quantity - 
   (lag(B_Quantity) OVER (ORDER BY price)) 

1 个答案:

答案 0 :(得分:0)

这是一种方法。

注意:通过查看数据,看起来没有特定的主键,但pricea_quantity的组合看起来很独特,因此我在join中使用了这两列。如果这只是您的示例数据,并且实际上您有primary key,我建议您将连接条件更改为primary key

REXTESTER DEMO

update Table1
set remaining_quantity = upd_tbl.cum
from 
(
select t.*
,a_quantity - sum(b_quantity) over (partition by a_quantity order by price) as cum
from table1 t
) upd_tbl
where table1.price=upd_tbl.price
and table1.a_quantity=upd_tbl.a_quantity;

说明: sum(b_quantity) over (partition by a_quantity order by price)将为您提供cumulative sum分区(2,6,10 ..)。现在,您可以从a_quantity中减去它以获得输出。