Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为剩余总计编写oracle sql查询_Sql_Oracle_Oracle11g - Fatal编程技术网

如何为剩余总计编写oracle sql查询

如何为剩余总计编写oracle sql查询,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,查询返回的数据集如下,我在下面显示了一些行,但实际返回的数据超过500k行 Date | amount 01-01-2010 | 200 01-02-2010 | 50 01-03-2010 | 400 01-04-2010 | 50 01-05-2010 | 0 01-06-2010 | 0 01-07-2010 | 100 我希望查询返回剩余金额列,如下所示: Date | amount | Remaining 01-01-2

查询返回的数据集如下,我在下面显示了一些行,但实际返回的数据超过500k行

Date         | amount
01-01-2010   | 200
01-02-2010   | 50
01-03-2010   | 400
01-04-2010   | 50
01-05-2010   | 0
01-06-2010   | 0
01-07-2010   | 100
我希望查询返回剩余金额列,如下所示:

Date         | amount   | Remaining
01-01-2010   | 200      | 600
01-02-2010   | 50       | 550
01-03-2010   | 400      | 150
01-04-2010   | 50       | 100
01-05-2010   | 0        | 100
01-06-2010   | 0        | 100
01-07-2010   | 100      | 0

“剩余金额”以“总金额之和”开始,即“所有记录金额之和”列。

这里有一种方法,使用与
合并的相关子查询:

select y.dt,
  y.amount,
  coalesce((select sum(amount)
   from yourtable y2
   where y2.dt > y.dt),0) as remaining
from yourtable y
order by y.dt

您可以使用oracle分析功能

SELECT DATE,
   AMOUNT,
   (SUM (AMOUNT) OVER ()) - (SUM (AMOUNT) OVER (ORDER BY DATE))
      AS REMAINING
FROM TABLE
您还可以使用来避免总和(金额)-(…)


使用分析函数应该比相关子查询提供更好的性能,因为表只扫描一次。

剩余的起始值来自哪里,
总和
?剩余值从总金额的总和开始使用窗口函数将比相关子查询快得多
SELECT dt, AMOUNT,
   nvl(sum(amount) over 
      (order by dt desc rows between unbounded preceding and 1 preceding)
   , 0) as REMAINING
FROM yourtable
order by dt