Sql 如何利用postgres和join表计算会计余额

Sql 如何利用postgres和join表计算会计余额,sql,database,postgresql,sum,window-functions,Sql,Database,Postgresql,Sum,Window Functions,我有一个与此相同的问题,但与联接表 我有一张桌子 ID amount deduct_id created_time 1 100.00 1 2020-01-01 15:30:20 2 10.00 1 2020-01-01 15:32:20 3 30.00 1 2020-01-01 15:43:20 4 5.00

我有一个与此相同的问题,但与联接表

我有一张桌子

ID      amount     deduct_id     created_time
1      100.00          1         2020-01-01 15:30:20
2       10.00          1         2020-01-01 15:32:20 
3       30.00          1         2020-01-01 15:43:20
4        5.00          1         2020-02-02 08:30:20
5       10.00          2         2020-02-02 23:30:20
6       20.00          2         2020-02-03 10:30:20
和表B

deduct_id      amount      created_time
1              100.00      2020-02-02 10:00:20
2               15.00      2020-02-03 10:00:20
现在我需要一个查询,该查询将给出以下结果:

ID     amount    deduct    Balance    created_time
1      100.00     0.00      100.00    2020-01-01 15:30:20
2       10.00     0.00      110.00    2020-01-01 15:32:20
3       30.00     0.00      140.00    2020-01-01 15:43:20
4        5.00     0.00      145.00    2020-02-02 08:30:20
null     0.00   100.00       45.00    2020-02-02 10:00:20
5       10.00     0.00       55.00    2020-02-02 23:30:20
null     0.00    15.00       40.00    2020-02-03 10:00:20
6       20.00     0.00       60.00    2020-02-03 10:30:20
我正在使用postgres 9.6

扣减id是指数据是否是该日期扣减的一部分

创建时间是用来表示时间线的

[更新] 如何实现按月过滤

ID     amount    deduct    Balance    created_time
1      100.00     0.00      100.00    2020-01-01 15:30:20
2       10.00     0.00      110.00    2020-01-01 15:32:20
3       30.00     0.00      140.00    2020-01-01 15:43:20


ID     amount    deduct    Balance    created_time
4        5.00     0.00      145.00    2020-02-02 08:30:20
null     0.00   100.00       45.00    2020-02-02 10:00:20
5       10.00     0.00       55.00    2020-02-02 23:30:20
null     0.00    15.00       40.00    2020-02-03 10:00:20
6       20.00     0.00       60.00    2020-02-03 10:30:20
我知道这是一个糟糕的桌子设计,但有可能达到这样的效果吗? 如何做到这一点


提前谢谢,非常感谢您的帮助。

我想这是
union all
和一个窗口
sum()


我不清楚
decreate\u id
应该用于什么列。从查询结果来看,似乎您不想使用它来定义分区,这与我的想法相反-因此我只是从查询中删除了if。

我认为这是
联合所有
和一个窗口
sum()


我不清楚
decreate\u id
应该用于什么列。从查询结果来看,您似乎不想使用它来定义分区,这与我的想法相反-因此我只是从查询中删除了if。

请澄清
decrete\u id
created\u time
的角色,展示您的尝试,并公开你的Postgres.updated@ErwinBrandstetter版本。我想用创建的时间过滤WHERE条件。因此,我可以在每月的特定范围内获得余额,起始余额是前一个月的最后一个余额。请澄清
扣减id
创建时间的角色,显示您尝试了什么,并披露您的Postgres.updated@ErwinBrandstetter版本。我想使用创建时间过滤WHERE条件。因此,我可以在每月的特定范围内获得平衡,起始平衡是前一个月的最后一个平衡,谢谢你的回答帮助我。但是如果你不介意的话,你知道如何在查询中使用WHERE created_time吗?所以我可以按日期过滤,起始金额是上个月的最后余额吗@GMBhi,谢谢你的回答帮助我。但是如果你不介意的话,你知道如何在查询中使用WHERE created_time吗?所以我可以按日期过滤,起始金额是上个月的最后余额吗@专线小巴
select
    id,
    amount,
    deduct,
    sum(amount - deduct) over(order by created_time) balance,
    created_time
from (
    select id, amount, 0 as deduct, created_time from tablea
    union all 
    select null, 0 as amount, amount as deduct, created_time from tableb
) t