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

Posted

技术标签:

【中文标题】对重复值求和时如何获得不同的总和?【英文标题】:How to get distinct sums when summing over repeated values? 【发布时间】:2013-06-03 22:33:50 【问题描述】:

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

这里是查询:

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

Here is the output

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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 的行的顺序,任意顺序可以在没有警告的情况下改变。

【讨论】:

完美,正是我需要的。谢谢! @user2449623:考虑添加的关于ORDER BY的信息。

以上是关于对重复值求和时如何获得不同的总和?的主要内容,如果未能解决你的问题,请参考以下文章

如何对不同列的值求和

复合求和:我想创建一个复合查询,它从两个不同的表中获取两列的单独总和,然后对它们求和

只删除一次重复值,然后对数组求和

sql总和值不同的id

将联合与laravel结合使用时如何获得两个不同表的总和

如何对同一集合中不同文档的值求和?