不使用分析函式的累計統計查詢
案例:以日期金額統計為例
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 二分查詢函式的使用函式
- 使用者登錄檔按照時間累積統計,應用group by 以及子查詢
- Oracle 分組彙總統計函式的使用Oracle函式
- Solr複雜查詢一:函式查詢Solr函式
- Mysql建表、索引、函式、查詢使用中的坑!!!MySql索引函式
- SQL查詢中用到的函式SQL函式
- 查詢統計SQL分組求和使用小技巧SQL
- MySQL中幾種資料統計查詢的基本使用教程MySql
- PostgreSQL 查詢替換函式SQL函式
- 學習PHP中統計擴充套件函式的使用PHP套件函式
- 第二章 :查詢與排序-------2.10常見函式的複雜度計算排序函式複雜度
- C++ 逆向之 main 函式的查詢C++AI函式
- Java-MySql-函式、多表查詢JavaMySql函式
- 分庫資料如何查詢統計
- 資料統計查詢最佳化
- MYSQL滿足條件函式里放查詢最大函式的方法MySql函式
- 留存統計 引數聚合函式函式
- Lesson17——NumPy 統計函式函式
- js積累函式JS函式
- 使用ASM框架實現統計函式執行時間ASM框架函式
- c++字串查詢函式實現C++字串函式
- 二分查詢(函式實現)函式
- Elasticsearch 第六篇:聚合統計查詢Elasticsearch
- mysql加強(3)~分組(統計)查詢MySql
- 【STAT】函式索引和使用表示式統計資訊有什麼不同函式索引
- 函式設計函式
- DAX 第六篇:統計函式函式
- golang count 單字元 字串 統計函式Golang字元字串函式
- UserService 查詢使用者查詢許可權 isGlobalQuery分析
- PHP 查詢、擷取字串函式詳解PHP字串函式
- PostgreSQL函式:返回表查詢結果集SQL函式
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊二(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊一(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊三(zt)ROSSQLServer優化
- 函式計算持續交付入門:雲效+FC實現 簡單IP查詢工具函式
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- 使用GraphQL查詢引數來設計強大的APIAPI
- 程式設計的知識點 (不斷積累,終身程式設計)程式設計