如何为剩余总计编写oracle sql查询
查询返回的数据集如下,我在下面显示了一些行,但实际返回的数据超过500k行如何为剩余总计编写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
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