Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PostgreSQL进行条件求和?_Sql_Postgresql - Fatal编程技术网

如何使用PostgreSQL进行条件求和?

如何使用PostgreSQL进行条件求和?,sql,postgresql,Sql,Postgresql,我有下表: ID Quantity date 100 20 1-NOV-15 100 30 1-OCT-15 100 10 1-OCT-15 100 5 1-AUG-15 101 4 1-AUG-15 我想为每个ID求和所有数量,直到与ID相关的日期,这意味着我想得到: ID Quantity Date sum 100 20 1-NOV-15 65 //

我有下表:

ID  Quantity     date
100    20     1-NOV-15
100    30     1-OCT-15
100    10     1-OCT-15
100    5      1-AUG-15
101    4      1-AUG-15
我想为每个
ID
求和所有
数量
,直到与
ID
相关的
日期
,这意味着我想得到:

ID  Quantity     Date      sum
100    20     1-NOV-15      65       // sum all ID 100 till 1-NOV-15
100    30     1-OCT-15      45       // sum all ID 100 till 1-OCT-15
100    10     1-OCT-15      45       // sum all ID 100 till 1-OCT-15
100    5      1-AUG-15       5       // sum all ID 100 till 1-AUG-15
101    4      1-AUG-15       4       // sum all ID 101 till 1-AUG-15
我很难得到这个结果。这是我写的:

Select ID,Date,SUM(Quantity)
From a
Group by ID,Date
order by ID

我不知道如何告诉
总和
传递所有相同
ID
且其
日期
较小的记录。

您想要一个累积或运行总和

Select ID, Date, SUM(Quantity) OVER (PARTITION BY ID ORDER BY DATE)
From a;
编辑:

默认的成帧选项是前一行和当前行之间的
范围
,而不是前一行和当前行之间的
。如果使用后者,结果将更像:

ID  Quantity     Date      sum
100    20     1-NOV-15      65       // sum all ID 100 till 1-NOV-15
100    30     1-OCT-15      45       // sum all ID 100 till 1-OCT-15
100    10     1-OCT-15      15       // sum all ID 100 till 1-OCT-15
100    5      1-AUG-15       5       // sum all ID 100 till 1-AUG-15
101    4      1-AUG-15       4       // sum all ID 101 till 1-AUG-15

但是,默认值适用于此问题。

您需要累积或运行总和

Select ID, Date, SUM(Quantity) OVER (PARTITION BY ID ORDER BY DATE)
From a;
编辑:

默认的成帧选项是前一行和当前行之间的
范围
,而不是前一行和当前行之间的
。如果使用后者,结果将更像:

ID  Quantity     Date      sum
100    20     1-NOV-15      65       // sum all ID 100 till 1-NOV-15
100    30     1-OCT-15      45       // sum all ID 100 till 1-OCT-15
100    10     1-OCT-15      15       // sum all ID 100 till 1-OCT-15
100    5      1-AUG-15       5       // sum all ID 100 till 1-AUG-15
101    4      1-AUG-15       4       // sum all ID 101 till 1-AUG-15

但是,默认值适用于此问题。

根据,默认的帧选项是
介于无界的前一行和当前行之间的范围
。在测试两个查询之后,它们确实返回相同(且正确)的结果。Marth是正确的,两个查询返回相同的结果。你能解释一下它是怎么工作的吗?我读了你提供的链接,但我不明白在第一个解决方案中,它如何知道在哪里计算?如果所需的解决方案确实是他在15和45结果中提出的,那么您需要做什么更改。@约翰:解释窗口函数的概念有点困难,特别是在注释中,但我认为它做得很好(虽然它没有说关于
RANGE
子句的任何内容,但是在阅读它之后,第一个链接应该更加清晰)。至于你的第二个问题,真的有点难说:你如何区分这两行
1-OCT-15
行?即为什么结果是15->45(即(5+10)->(5+10+30))而不是35->45?@Marth…谢谢。我反向获得了默认行为,并相应地更改了答案。根据,默认的框架选项是
介于无界的前一行和当前行之间的范围
。在测试两个查询后,它们确实返回相同的结果(并且正确)结果。Marth是正确的。两个查询返回相同的结果。你能解释一下它是如何工作的吗?我阅读了你给出的链接,但我不明白在第一个解决方案中,它如何知道在哪里计算?如果所需的解决方案确实是他在15和45结果中播种的结果,那么你必须改变什么。@John:解释c有点困难关于窗口函数的概念,特别是在注释中,但是我认为它做得很好(虽然它没有提到
RANGE
子句,但是在阅读它之后,第一个链接应该更清楚).至于你的第二个问题,真的有点难说:你如何区分这两个
1-OCT-15
行?也就是说,为什么结果是15->45(即(5+10)->(5+10+30)),而不是35->45?@Marth…谢谢你。我把默认行为倒过来,并相应地更改了答案。