案例:以日期金额统计为例
SQL> select * from day_sales;
SALE_DATE DAY_AMOUNT
----------- ----------
2015/1/1 300
2015/1/3 300
2015/1/4 400
2015/1/5 1000
首先分析函数很容易就能得到结果,所以先看一下分析函数的统计结果:
SQL> select
2 t.sale_date
3 ,t.day_amount
4 ,sum(t.day_amount) over (order by t.sale_date rows between unbounded preceding and current row) as sum_res
5 from day_sales t
6 ;
SALE_DATE DAY_AMOUNT SUM_RES
----------- ---------- ----------
2015/1/1 300 300
2015/1/3 300 600
2015/1/4 400 1000
2015/1/5 1000 2000
然后,不用分析函数实现:
SQL> select
2 t.sale_date
3 ,t.day_amount
4 ,(select sum(day_amount) from day_sales t1 where t1.sale_date <= t.sale_date) as sum_res
5 from day_sales t
6 ;
SALE_DATE DAY_AMOUNT SUM_RES
----------- ---------- ----------
2015/1/1 300 300
2015/1/3 300 600
2015/1/4 400 1000
2015/1/5 1000 2000
=============================切割线=========================================
变一下这个例子:
SALE_DATE USERID ITEM_ID AMOUNT
----------- --------------------------------------- --------------------------------------- ------------
2015/1/1 1001 101 100.00
2015/1/1 1002 121 200.00
2015/1/3 1001 101 300.00
2015/1/4 1003 103 400.00
2015/1/5 1004 101 500.00
2015/1/5 1004 105 500.00
用分析函数 和 不用分析函数 分别求 按日期升序的累计 (结果跟上面的例子是一样的)
思路其实就是将子集先整理好,然后再生成最终结果集!
先用分析函数:
SQL> select
2 t.sale_date
3 ,t.day_amount
4 ,sum(t.day_amount) over (order by t.sale_date rows between unbounded preceding and current row) as sum_res
5 from
6 (
7 select
8 sale_date
9 ,sum(amount) as day_amount
10 from tb_sales
11 group by sale_date
12 order by sale_date
13 ) t
14 ;
SALE_DATE DAY_AMOUNT SUM_RES
----------- ---------- ----------
2015/1/1 300 300
2015/1/3 300 600
2015/1/4 400 1000
2015/1/5 1000 2000
不使用分析函数,按照切割线前面的例子做一个体会其实就很快得到结果了:
SQL> select
2 t.sale_date
3 ,t.day_amount
4 ,(select sum(t1.amount) from tb_sales t1 where t1.sale_date <= t.sale_date) as sum_res
5 from
6 (
7 select
8 sale_date
9 ,sum(amount) as day_amount
10 from tb_sales
11 group by sale_date
12 order by sale_date
13 ) t
14 ;
SALE_DATE DAY_AMOUNT SUM_RES
----------- ---------- ----------
2015/1/1 300 300
2015/1/3 300 600
2015/1/4 400 1000
2015/1/5 1000 2000
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28929558/viewspace-1805281/
,如需转载,请注明出处,否则将追究法律责任。