postgresql中的灵活求和

时间:2015-10-18 10:36:46

标签: sql postgresql

我有一张表格如下:

def, amount , date
add    5       1.1.15
add    5       2.1.15
add    1       3.1.15
remove 5       4.1.15
add    4       4.1.15
make   8       4.1.15
add    5       4.1.15

我需要编写一个执行def(添加/删除)操作的查询并显示它,如果还有其他操作它应该显示最后一行值:

def, amount , date        , afterdone
add    5       1.1.15           5
add    5       2.1.15           10            / 5+5
add    1       3.1.15           11            / 10+1
remove 5       4.1.15            6            /11-5
add    4       4.1.15           10            /6+4
make   8       4.1.15           10            / 10 the value row above
add    5       4.1.15           15            /10+5

您可以假设已根据需要对行进行了排序。

我想过用

做窗口功能
ROWS between UNBOUNDED PRECEDING and CURRENT ROW 

但它没有多重操作(它不知道什么是添加,删除,制作......)

我该怎么做?

编辑:让它变得简单....假设这是原始表。 id定义谁来之前谁。

id    def, amount , date
 1   add    5       1.1.15
 2   add    5       2.1.15
 3   add    1       3.1.15
 4   remove 5       4.1.15
 5   add    4       4.1.15
 6   make   8       4.1.15
 7   add    5       4.1.15

1 个答案:

答案 0 :(得分:6)

您可以使用窗口函数执行此操作,假设您有一个指定订购的列。 SQL表表示无序集。您需要一个用于订购的列。所以:

select t.*,
       sum(case when def = 'add' then amount
                when def = 'remove' then - amount
                else 0
           end) over (order by date, id)
from atable t;

这假定iddate之后的辅助排序列。但是,如果date有时间成分,那么这不是必需的。