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