17

这是我的问题..

Actual   Auction   Ammanat   id
7000     500       100       228,229
7000     100       100       228,229
7000     900       100       228,229
5000     0         0         230

我想要下面给出的结果

Actual   Auction   Ammanat   Remaining  id
7000     500       100       5550       228,229
7000     100       100       5550       228,229
7000     900       100       5550       228,229
5000     0         0         5000        230

这里,Remaining(sum(auction)-actual)

我正在使用 PostgreSQL。但是,如果有人知道 SQL Server 中的解决方案,那就没问题了。

4

2 回答 2

22

您需要使用窗口功能 - http://www.postgresql.org/docs/9.3/static/tutorial-window.html

就像是:

(Sum(Auction) OVER ()) - actual AS Remaining
于 2013-10-09T12:18:32.113 回答
14

伊丹是 100% 正确的。我想对此进行解释:

(SUM (Auction) OVER ())
  • OVER ()创建一个窗口,包括原始查询中的所有行
  • SUM (Auction)是一个窗口函数,用于计算 的总和Auction

下面是进一步的解释:

  • Window是查询结果集中用户指定的一组行。

  • 窗口函数计算窗口SUM中所有行的值(例如 )。

  • 所有行都在窗口中,因为OVER()不包括PARTITION BY. 随着PARTITION BY窗口将包括行的子集。

来自 MSDN

... OVER 子句定义查询结果集中的一个窗口或用户指定的一组行。然后窗口函数为窗口中的每一行计算一个值。您可以将 OVER 子句与函数一起使用来计算聚合值……如果 OVER 子句不包括 PARTITION BY。这意味着该函数将应用于查询返回的所有行。

于 2015-04-23T18:42:50.860 回答