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

时间:2012-08-02 10:52:48

标签: sql postgresql

首先,这是我关于该问题的第一个问题:SQL request to group and sum numbers by their day of creation

现在,想象一下我想让它变得更复杂,在之前的操作之后并且由于答案,我有按天分组的结果,所以每天的每个条目都被添加。我有这个:

1 | 200 | 2010-01-01
2 | 100 | 2010-01-01

转变为:

1 | 300 | 2010-01-01

这已经很不错了,但是如果我希望每次增加金额字段怎么办?

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;

3 个答案:

答案 0 :(得分:3)

可以使用窗口函数完成运行总和:

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是实际的数据类型date,则没有理由在其上使用to_char()。顺便说一句:对于列名使用保留字(date)并不是一个非常好的主意。

这里重要的是order by作为over定义的一部分。

手册中的更多详细信息:http://www.postgresql.org/docs/current/static/tutorial-window.html

答案 1 :(得分:1)

这是一个总计。

查看following question。 Quassnoi的回答是PostgreSQL。

答案 2 :(得分:0)

试试这个:

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