Sql 避免循环导致的数据库往返

Sql 避免循环导致的数据库往返,sql,postgresql,sqlalchemy,Sql,Postgresql,Sqlalchemy,我正在使用postgres,最近我遇到我正在使用的代码有太多的往返 我所做的基本上是每天从表中获取数据,因为我必须每天查找更改,但完成此工作的整个函数每月调用一次 我的桌子的一个例子 数量 Id | Itemid | Amount | Date 1 | 2 | 50 | 20-5-20 现在这个表可以在任何时间点更新以添加项目,我必须看到每天的总金额。 但这里有一个陷阱,我必须以5%的利率给每天的金额加上利息。 所以我不能只调用一次函数,我必须每天查看它的值 例如,如果我在

我正在使用postgres,最近我遇到我正在使用的代码有太多的往返

我所做的基本上是每天从表中获取数据,因为我必须每天查找更改,但完成此工作的整个函数每月调用一次

我的桌子的一个例子

数量

Id | Itemid | Amount | Date
1  |   2    |  50    | 20-5-20
现在这个表可以在任何时间点更新以添加项目,我必须看到每天的总金额。 但这里有一个陷阱,我必须以5%的利率给每天的金额加上利息。 所以我不能只调用一次函数,我必须每天查看它的值

例如,如果我在5月1日添加了一项50美元的项目,则该日的利息为
5/100*50
我在5月5日增加了另一个项目,价值50美元,现在第5天的利息是
5/100*50

但在5号之前,利息只有50美元,所以如果我只是简单地使用
SUM(Amount)*5/100
。这是错误的

另外,另一个问题是,日期存储为时间戳,我需要按时间戳的日期对其进行分组,因为如果我根据时间戳对其进行分组,那么它将为同一日期创建多行,我希望在求和时避免这样做。 因此,如果在同一日期有两个条目,但时间不同,理想情况下,查询应将其汇总为一个日期。 范例

结果应该是

Amount Table
Date              |     Amount
2020-5-5                 200
我现在的代码

for i in numberofdaysinthemonth:
    amount = amount + session.query(func.sum(Amount.Amount)).filter(Amount.date<current_date).scalar() * 5/100

由于函数每月调用一次,我应该如何避免循环运行30次。

一般来说,为了避免应用程序和数据库之间的往返,应用程序代码必须使用过程语言以存储代码(存储过程和存储函数)的形式从应用程序移动到数据库。这种方法有时在商业数据库(如Oracle数据库)中称为“厚数据库”

PostgreSQL的默认过程语言是,但您可以使用Java、Perl、Python和Javascript,使用您需要在PostgreSQL中安装的PostgreSQL扩展


我应该每天在一个表中获取所有这些数据,并将其聚合为每天的金额总和

这是一个简单的“运行总数”

如果您需要每个itemid的金额

select "date",
       sum(amount) over (partition by itemid order by "date") as amount_til_date
from the_table
order by "date";
如果您还需要计算截至当日的“复合利率”,您也可以这样做:

select item_id, 
       "date", 
       sum(amount) over (partition by itemid order by "date") as amount_til_date,
       sum(amount) over (partition by item_id order by "date") * power(1.05, count(*) over (partition by item_id order by "date")) as compound_interest
from the_table
order by "date";
要获取特定月份的数据,请添加WHERE子句:

where "date" >= date '2020-06-01'
  and "date" < date '2020-07-01'
其中“日期”>=日期“2020-06-01”
和“日期”<日期“2020-07-01”

是否可以传递sql查询?简单的sql语句。嗯,这难道不像一个运行总数那么简单吗?我应该每天在一个表中获取所有这些数据,并将其聚合为每天的金额总和。嗯,当电源对稀疏数据做出反应时,
如何计算(按项划分\u id顺序按“日期”)
呢?如果日期存储为时间戳呢?我想按日期分组,而不是按时间戳分组,在这个查询中,如果两个时间戳不同,但它们的日期是6月1日,它将创建两行,值为6月1日。然后将它们转换为日期::date我尝试过,起初我认为它可以工作,但这并不奇怪,它不是在同一日期对值求和,而是只取一个值并删除其他值。
select "date",
       sum(amount) over (partition by itemid order by "date") as amount_til_date
from the_table
order by "date";
select item_id, 
       "date", 
       sum(amount) over (partition by itemid order by "date") as amount_til_date,
       sum(amount) over (partition by item_id order by "date") * power(1.05, count(*) over (partition by item_id order by "date")) as compound_interest
from the_table
order by "date";
where "date" >= date '2020-06-01'
  and "date" < date '2020-07-01'