2

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

这是查询:

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

这是输出

本质上,我希望这张表可以阅读:

4--主板-------- 22----399
5--RAID控制器----22----421

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

旁白:如果有人感兴趣,这就是我所关注的

4

1 回答 1

3

通过添加为第二项使OVER子句中的顺序唯一:idORDER BY

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

按照您的方式,相等的销售额被视为相同的同行FRAME并立即求和。
您所遵循的教程不适用于此特定查询。

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

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

于 2013-06-03T22:41:28.177 回答