按字段中的前一个数字递增该字段的SQL查询

按字段中的前一个数字递增该字段的SQL查询,sql,postgresql,Sql,Postgresql,首先,这是我关于这个问题的第一个问题: 现在,想象一下我想让它变得更复杂,经过前面的操作,由于答案,我将结果按天分组,因此每天的每个条目都会被添加。我有这个: 1 | 200 | 2010-01-01 2 | 100 | 2010-01-01 转化为: 1 | 300 | 2010-01-01 这已经很好了,但是如果我想让amount字段每次递增怎么办 1 | 300 | 2010-01-01 2 | 200 | 2010-01-02 将成为: 1 | 300 | 2010-01-01 2

首先,这是我关于这个问题的第一个问题:

现在,想象一下我想让它变得更复杂,经过前面的操作,由于答案,我将结果按天分组,因此每天的每个条目都会被添加。我有这个:

1 | 200 | 2010-01-01
2 | 100 | 2010-01-01
转化为:

1 | 300 | 2010-01-01
这已经很好了,但是如果我想让amount字段每次递增怎么办

1 | 300 | 2010-01-01
2 | 200 | 2010-01-02
将成为:

1 | 300 | 2010-01-01
2 | 500 | 2010-01-02
x | (previous amount + this amount) | this date
我得到的sql查询得益于对我前面问题的回答:

select sum(amount), to_char(date, 'YYYY-MM-DD') 
from mytable 
group by to_char(date, 'YYYY-MM-DD') 
order by sum(amount) ASC;

这是一个连续的总数


看一看这张照片。Quassnoi的答案考虑了PostgreSQL。

这是一个连续的总数


看一看这张照片。Quassnoi给出的答案考虑了PostgreSQL。

可以使用窗口函数进行运行求和:

select sum(amount) over (order by date asc), 
       to_char(date, 'YYYY-MM-DD') 
from mytable 
order by date ASC;
如果您希望运行汇总结果的总和,只需将其放入子查询:

select sum(day_total) over (order by date) as running_total,
       day_total, 
       date
from (
  select sum(amount) as day_total, 
         date
  from mytable 
  group by date
) t
order by date
如果列日期是数据类型日期的实际日期,则没有理由在其上使用字符。顺便说一句:在列名中使用保留字date不是一个非常好的主意

这里重要的是orderby作为over定义的一部分


手册中的更多详细信息:

可以使用窗口功能进行运行求和:

select sum(amount) over (order by date asc), 
       to_char(date, 'YYYY-MM-DD') 
from mytable 
order by date ASC;
如果您希望运行汇总结果的总和,只需将其放入子查询:

select sum(day_total) over (order by date) as running_total,
       day_total, 
       date
from (
  select sum(amount) as day_total, 
         date
  from mytable 
  group by date
) t
order by date
如果列日期是数据类型日期的实际日期,则没有理由在其上使用字符。顺便说一句:在列名中使用保留字date不是一个非常好的主意

这里重要的是orderby作为over定义的一部分

手册中的更多详细信息:

请尝试以下操作:

 select date,(select sum(amount)
                    from mytable11 T1 
                    where T1.date<=T2.date
                    )as cum_sum
from mytable11 T2
group by date
试试这个:

 select date,(select sum(amount)
                    from mytable11 T1 
                    where T1.date<=T2.date
                    )as cum_sum
from mytable11 T2
group by date

此查询获取所有记录。它不分组和汇总这部分工作的金额,因为白天的汇总已经不再进行了。我得到了有效的运行总和,但如果我每天有两个条目,那么这些条目的总和是相同的。1 | 300 | 2010-01-01 2 | 300 | 2010-01-01 3 | 600 | 2010-01-02而不是:1 | 300 | 2010-01-01 2 | 600 | 2010-01-02不用说这远远超过了我目前的sql技能^^这个查询得到了所有记录。它不分组和汇总这部分工作的金额,因为白天的汇总已经不再进行了。我得到了有效的运行总和,但如果我每天有两个条目,那么这些条目的总和是相同的。1 | 300 | 2010-01-01 2 | 300 | 2010-01-01 3 | 600 | 2010-01-02而不是:1 | 300 | 2010-01-01 2 | 600 | 2010-01-02不用说这远远超过了我目前的sql技能^谢谢你的澄清,我不确定我是否理解那里说的话,也许我会用一种更简单但草率的方式来做。谢谢你的澄清,我不确定我是否理解那里说的话,也许我会用一种更简单但草率的方式来做。很抱歉,我没有设法修改您的查询,它说cum_sum不存在。尽管上述解决方案有效,但我猜它与您的机制几乎相同。[date]不是有效的语法Postgres@Alex:我在sql server中完成了此操作,对不起,我不知道postgressqlI我知道,我只是将我的var翻译成英文,以便在stackoverflow上理解,我的真实var不是日期。对不起,我没有设法调整您的查询,它说cum_sum不存在。尽管上述解决方案有效,但我猜它与您的机制几乎相同。[date]不是有效的语法Postgres@Alex:我在sql server中完成了这项工作,对不起,我不知道Postgressql我知道,我只是将我的var翻译成英文,以便在stackoverflow上理解,我真正的var不是日期。