1

首先,这是我关于该问题的第一个问题: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;
4

3 回答 3

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

于 2012-08-02T11:01:33.340 回答
1

这是一个运行总数。

看看下面的问题。Quassnoi 的回答考虑了 PostgreSQL。

于 2012-08-02T11:01:23.870 回答
0

试试这个:

 select date,(select sum(amount)
                    from mytable11 T1 
                    where T1.date<=T2.date
                    )as cum_sum
from mytable11 T2
group by date
于 2012-08-02T11:35:19.457 回答