Running Total是什么意思呢?
假设我们有一张表:TRANS,表明我们有的交易记录,其中有一个column是id,另一个是money(表示该笔交易设计的金额),我们的需求就是如何计算每笔交易以后累积的交易总数。例子如下:
id | money |
1 | 10 |
2 | 20 |
3 | 15 |
4 | 5 |
5 | 50 |
如果算每次累积的,就依次是10,30,45,50,100。
一种方式:(这种方式效率比较低O(n*n),n是表大小)
SELECT T1.ID, T1.MONEY, SUM(T2.MONEY) RUNNING_TOTAL FROM TRANS T1,TRANS T2
WHERE T1.ID >= T2.ID
GROUP BY T1.ID, T1.MONEY
ORDER BY T1.ID ASC
ORACLE下,也可以使用OVER:
SELECT ID, SUM(MONEY) OVER (ORDER BY ID) RUNNINGT_TOTAL FROM TRANS
还有一种方式,就是使用Materialized View,这种方式其实就是暂时存储了query的执行结果,然后通过一定的机制进行refresh。
https://docs.oracle.com/cd/B10501_01/server.920/a96567/repmview.htm
参考资料:
http://www.1keydata.com/sql/sql-running-totals.html
http://www.dba-oracle.com/t_over_analytic_function.htm
http://www.1keydata.com/sql/advanced.html
http://blog.jooq.org/2013/11/03/probably-the-coolest-sql-feature-window-functions/
http://tapoueh.org/blog/2013/08/20-Window-Functions