【发布时间】:2019-07-13 19:28:55
【问题描述】:
我正在尝试从以下包含交易的 postgresql 表中计算银行账户的每月余额:
# \d transactions
View "public.transactions"
Column | Type | Collation | Nullable | Default
--------+------------------+-----------+----------+---------
year | double precision | | |
month | double precision | | |
bank | text | | |
amount | numeric | | |
在“滚动总和”中,我的意思是总和应该包含从开始时间到给定月份结束的所有交易的总和,而不仅仅是给定月份中的所有交易。
我想出了以下查询:
select
a.year, a.month, a.bank,
(select sum(b.amount) from transactions b
where b.year < a.year
or (b.year = a.year and b.month <= a.month))
from
transactions a
order by
bank, year, month;
问题在于,每个银行每个月的行数与那里的交易数一样多。如果更多,那么更多,如果没有,那么没有。 我想要一个查询,其中每个银行和月份在整个时间间隔(包括第一笔和最后一笔交易)中恰好包含一行。
怎么做?
可以在https://rextester.com/WJP53830 找到示例数据集和查询,由@a_horse_with_no_name 提供
【问题讨论】:
-
你也可以标记正在使用的 dbms 吗?
-
样本数据和期望的结果真的很有帮助。 你所说的“月结余”是什么意思? 你所说的“滚动”是什么意思?数据中如何表示“银行账户”?
-
大多数数据库都提供了一个窗口函数来计算累积和。但是使用它的细节很大程度上取决于您使用的 DBMS。您应该始终在涉及 SQL 的问题中包含特定的数据库技术。
-
不相关,但是:
year和month最好存储为integer
标签: sql postgresql