2013-06-03 50 views
2

我遇到的問題是Postgres,因爲使用帶有非唯一值的SUM或「銷售」會導致非唯一的累計總和或「正在運行的銷售額」。如何求和重複值時得到不同的總和?

下面是該查詢:

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

回答

3

充分利用OVER order by子句中唯一加入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的行的排序,任意的順序可以在沒有警告的情況下改變。

+0

完美的,正是我所需要的。謝謝! – rennatnart

+0

@ user2449623:考慮添加有關'ORDER BY'的信息。 –