在对重复值求和时如何获得不同的总和?

时间:2013-06-03 22:33:51

标签: sql postgresql sum window-functions

我遇到的问题是Postgres,因为使用具有非唯一值的SUM或“sales”会导致非唯一累积金额或“正在运行的销售额”。

以下是查询:

SELECT *, 
       SUM(Sales) OVER (ORDER BY sales DESC) as running_sales 
FROM t;

Here is the output

基本上我希望此表格为:

4--Motherboards------- 22----399
5--RAID Controllers----22----421

有没有人对如何做到这一点有任何想法?

旁白:如果有人有兴趣,这就是我following

1 个答案:

答案 0 :(得分:3)

通过将OVER添加为第二个id项,使ORDER BY子句中的顺序唯一:

SELECT *, 
       SUM(Sales) OVER (ORDER BY sales DESC, id) as running_sales 
FROM   t
ORDER  BY sales DESC, id;

您拥有它的方式,同等销售额被视为同一FRAME中的同行并立即汇总。
tutorial you were following对此特定查询无益。

此外,您可能希望在查询本身中添加ORDER BY以获得稳定的结果。这非常便宜,因为它与窗口函数的排序顺序一致。

现在实现的方式,您通常会按照窗口函数的顺序从简单查询中获取此查询的结果,因为这是最便宜的方式。但是Postgres不保证没有ORDER BY的行的排序,任意顺序可以在没有警告的情况下改变。