不使用分析函式的累計統計查詢
案例:以日期金額統計為例
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
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部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1805281/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分析函式——統計函式
- oracle 統計分析函式Oracle函式
- 分析函式之排名統計函式
- 【SQL】使用分析函式與關聯子查詢的比較SQL函式
- select查詢之五:分析函式在查詢的運用函式
- 二分查詢函式的使用函式
- 統計資訊的查詢方法
- 使用者登錄檔按照時間累積統計,應用group by 以及子查詢
- Solr的函式查詢(FunctionQuery)Solr函式Function
- 使用LAG和LEAD函式統計函式
- oracle的sql查詢分析函式-高階部分-分析函授over()子句OracleSQL函式
- Oracle 分組彙總統計函式的使用Oracle函式
- Solr複雜查詢一:函式查詢Solr函式
- Oracle統計分析函式集,over(partition by..) 的運用Oracle函式
- 查詢統計SQL分組求和使用小技巧SQL
- Mysql建表、索引、函式、查詢使用中的坑!!!MySql索引函式
- SQL查詢中用到的函式SQL函式
- oracle中LAG()和LEAD()等分析統計函式的用法(統計月增長率)Oracle函式
- MySQL中幾種資料統計查詢的基本使用教程MySql
- PostgreSQL 查詢替換函式SQL函式
- 子串查詢函式strstr函式
- 數字查詢統計重複
- 利用樹形查詢實現部分分析函式功能函式
- 學習PHP中統計擴充套件函式的使用PHP套件函式
- 統計Oracle 查詢事務數的方法Oracle
- 【筆記】oracle 統計函式筆記Oracle函式
- SQL Server 2000 中查詢優化器使用的統計SQLServer優化
- Oracle 分析函式的使用Oracle函式
- Java-MySql-函式、多表查詢JavaMySql函式
- [Mysql 查詢語句]——集合函式MySql函式
- iPhone查詢序列號生成函式iPhone函式
- RANK函式基於條件的查詢函式
- C++ 逆向之 main 函式的查詢C++AI函式
- 分庫資料如何查詢統計
- 資料統計查詢最佳化
- 查詢某時間段的統計資料
- Oracle分析函式、多維函式和Model函式簡要說明,主要針對BI報表統計Oracle函式
- SQL 部分函式的使用,子查詢,group by,虛擬欄位,case……SQL函式