Oracle分析函數
阿新 • • 發佈:2017-10-24
ren 求值 col to_date es2017 簡潔 font oracl .cn
先通過一個例子,直觀的感受下分析函數的簡潔方便:
create table CRISS_SALES ( DEPT_ID VARCHAR2(6), --部門號 SALE_DATE DATE, --銷售日期 GOODS_TYPE VARCHAR2(4), --貨物類型 SALE_CNT NUMBER(10) --銷售數量 );
插入測試數據:
insert into CRISS_SALES values (‘D01‘, TO_DATE(‘20140304‘, ‘YYYYMMDD‘), ‘G00‘, 700); insert into CRISS_SALES values (‘D02‘, TO_DATE(‘20140306‘, ‘YYYYMMDD‘), ‘G00‘, 500); insert into CRISS_SALES values (‘D01‘, TO_DATE(‘20140408‘, ‘YYYYMMDD‘), ‘G01‘, 200); insert into CRISS_SALES values (‘D02‘, TO_DATE(‘20140427‘, ‘YYYYMMDD‘), ‘G01‘, 300); insert into CRISS_SALES values (‘D01‘, TO_DATE(‘20140430‘, ‘YYYYMMDD‘), ‘G03‘, 800); insert into CRISS_SALES values (‘D02‘, TO_DATE(‘20140502‘, ‘YYYYMMDD‘), ‘G03‘, 900); insert into CRISS_SALES values (‘D01‘, TO_DATE(‘20140504‘, ‘YYYYMMDD‘), ‘G02‘, 80); insert into CRISS_SALES values (‘D02‘, TO_DATE(‘20140408‘, ‘YYYYMMDD‘), ‘G02‘, 100);
需求:求出全公每個時點司累計的銷售數量,利用分析函數SQL如下:
SELECTT.DEPT_ID , T.SALE_DATE , T.GOODS_TYPE , T.SALE_CNT, SUM(SALE_CNT) OVER(ORDER BY SALE_DATE ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) ALL_CMP_CNT FROM CRISS_SALES T
結果如下:
通過這個例子,可以看到利用分析函數解決某些場景下的問題非常的直觀簡便。
分析函數是什麽?
分析函數是Oracle專門用於解決復雜報表統計需求的功能強大的函數,它可以在數據中進行分組然後計算基於組的某種統計值,並且每一組的每一行都可以返回一個統計值。
分析函數和聚合函數的不同之處是什麽?
普通的聚合函數用group by分組,每個分組返回一個統計值,而分析函數采用partition by分組,並且每組每行都可以返回一個統計值。
分析函數的形式?
分析函數帶有一個開窗函數over(),包含三個分析子句:分組(partition by), 排序(order by), 窗口(rows) ,他們的使用形式如下:over(partition by xxx order by yyy rows between zzz and qqq)。
分析函數適用於哪些場景?
1.表內數據聚合累加
2.表內分組累加
3.分組排名
4.滾動統計
5.範圍求值SUM MAX MIN
6.相鄰行比較
等等...
Oracle分析函數