Postgresql返回值递减

时间:2018-07-09 06:27:01

标签: postgresql join outer-join math-functions

我有一个查询,该查询返回一个人已支付的物品,该物品的价格和余额。我的问题是,在某些情况下,一个人可能要为一项付款2次(以后再付款,另一笔还款)。因此返回的表如下所示:

 name    | invoice_id| inv_date | item_id|item     | pay_id | price | paid | balance |
---------|-----------|----------|--------|---------|--------|-------|------|---------|
 John Doe| 581       | 2018-4-10| 10     |Transport| 1165   | 8100  | 5400 | 2700    |
 John Doe| 581       | 2018-4-10| 10     |Transport| 1030   | 8100  | 2700 | 5400    |
 John Doe| 581       | 2018-4-10| 25     |Insurance| 1165   | 24000 | 12000| 12000   |
 John Doe| 581       | 2018-4-10| 25     |Insurance| 1030   | 24000 | 12000| 12000   |
---------|-----------|----------|--------|---------| -------|-------|------|---------|

从返回结果中可以看到,第二次付款的余额不正确。例如,以运输的第二次付款为例,先前的付款是5400,而当前的付款是2700,所以(5400 + 2700 = 8100 ),因此余额应为0。所以我的问题是,如何为以后每次付款都返还适当的余额?

目前,我将balance作为(price - paid)退回,但对于后续付款,余额不正确。

1 个答案:

答案 0 :(得分:1)

您想要一个窗口功能。

 price - 
    sum(paid) over (partition by item_id order by pay_id desc)
    as balance.

您可能希望使用其他顺序,请使用报表使用的任何顺序。