Oracle高級分析函數(shù)與統(tǒng)計函數(shù)結(jié)合使用

這個blog我們來聊聊Oracle高級分析函數(shù)與統(tǒng)計統(tǒng)計函數(shù)結(jié)合使用

測試數(shù)據(jù):

DROP TABLE testa;

CREATE TABLE testa (area VARCHAR2 (20), month VARCHAR2 (20),

amount NUMBER);

insert into testa values ('上海', '1', 199);?

insert into testa values ('上海', '2', 199);?

insert into testa values ('上海', '3', 155);?

insert into testa values ('上海', '3', 155);?

insert into testa values ('上海', '4', 125);?

insert into testa values ('廣州', '1', 75);?

insert into testa values ('廣州', '2', 67);?

insert into testa values ('北京', '1', 235);

insert into testa values ('北京', '2', 330);?

Commit;

一.keep函數(shù)

keep是Oracle下的另一個分析函數(shù)龄句,他的用法不同于通過over關鍵字指定的分析函數(shù),可以用于這樣一種場合下:取同一個分組下以某個字段排序后,對指定字段取最小或最大的那個值纸厉。

keep語法:

min | max(col1) keep (dense_rank first | lastorder by col2) over (partion by col3);?

最前是聚合函數(shù),可以是min、max、avg贴妻、sum...

col1為要計算的列;

dense_rank first蝙斜,dense_rank last為keep 函數(shù)的保留屬性名惩,表示分組、排序結(jié)果集中第一個孕荠、最后一個娩鹉;

解釋:返回按照col3分組后,按照col2排序的結(jié)果集中第一個或最后一個最小值或最大值col1稚伍。

col1和col2列可重復

需求:求員工表每個員工信息及部門最高薪資弯予、最低薪資

--傳統(tǒng)sql寫法,需要嵌套一層臨時表

with tmp1 as

(

select e.deptno,max(e.sal) max_sal,min(e.sal) min_sal

from emp e

group by e.deptno

)

select e2.deptno,

e2.ename,

e2.sal,

max_sal,

min_sal

from emp e2

left join tmp1?

on e2.deptno = tmp1.deptno

ORDER BY e2.deptno, e2.sal, e2.ename;

--排名函數(shù)只能進行排名,通過排名可以看出最大和最小薪資,同樣需要嵌套臨時表來完成此類需求

--通過keep函數(shù),無需嵌套子查詢,代碼邏輯更為簡單?

SELECT Deptno,

Ename,

Sal,

MIN(Sal) KEEP(DENSE_RANK FIRST ORDER BY sal) OVER(PARTITION BY deptno) max_sal,

MAX(sal) KEEP(DENSE_RANK LAST ORDER BY sal) OVER(PARTITION BY deptno) min_sal

FROM Emp

ORDER BY deptno, sal, ename;

SQL> --傳統(tǒng)sql寫法,需要嵌套一層臨時表

SQL> with tmp1 as

2 (

3 select e.deptno,max(e.sal) max_sal,min(e.sal) min_sal

4 from emp e

5 group by e.deptno

6 )

7 select e2.deptno,

8 e2.ename,

9 e2.sal,

10 max_sal,

11 min_sal

12 from emp e2

13 left join tmp1

14 on e2.deptno = tmp1.deptno

15 ORDER BY e2.deptno, e2.sal, e2.ename;

DEPTNO ENAME SAL MAX_SAL MIN_SAL

------ ---------- --------- ---------- ----------

10 MILLER 1300.00 5000 1300

10 CLARK 2450.00 5000 1300

10 KING 5000.00 5000 1300

20 SMITH 800.00 3000 800

20 ADAMS 1100.00 3000 800

20 JONES 2975.00 3000 800

20 FORD 3000.00 3000 800

20 SCOTT 3000.00 3000 800

30 JAMES 950.00 2850 950

30 MARTIN 1250.00 2850 950

30 WARD 1250.00 2850 950

30 TURNER 1500.00 2850 950

30 ALLEN 1600.00 2850 950

30 BLAKE 2850.00 2850 950

14 rows selected

SQL> --排名函數(shù)只能進行排名,通過排名可以看出最大和最小薪資,同樣需要嵌套臨時表來完成此類需求

SQL> --通過keep函數(shù),無需嵌套子查詢,代碼邏輯更為簡單

SQL> SELECT Deptno,

2 Ename,

3 Sal,

4 MIN(Sal) KEEP(DENSE_RANK FIRST ORDER BY sal) OVER(PARTITION BY deptno) max_sal,

5 MAX(sal) KEEP(DENSE_RANK LAST ORDER BY sal) OVER(PARTITION BY deptno) min_sal

6 FROM Emp

7 ORDER BY deptno, sal, ename;

DEPTNO ENAME SAL MAX_SAL MIN_SAL

------ ---------- --------- ---------- ----------

10 MILLER 1300.00 1300 5000

10 CLARK 2450.00 1300 5000

10 KING 5000.00 1300 5000

20 SMITH 800.00 800 3000

20 ADAMS 1100.00 800 3000

20 JONES 2975.00 800 3000

20 FORD 3000.00 800 3000

20 SCOTT 3000.00 800 3000

30 JAMES 950.00 950 2850

30 MARTIN 1250.00 950 2850

30 WARD 1250.00 950 2850

30 TURNER 1500.00 950 2850

30 ALLEN 1600.00 950 2850

30 BLAKE 2850.00 950 2850

14 rows selected

需求:每月的最高和最低銷售額對應的區(qū)域(如有多個區(qū)域按區(qū)域列出最小的一個,如某區(qū)域某月無銷售額則不做統(tǒng)計

SELECT t1.month,

MIN(area) keep(dense_rank FIRST ORDER BY amount DESC) max_area,

MIN(area) keep (dense_rank FIRST ORDER BY amount) min_area

FROM testa t1

GROUP BY t1.month;

SQL> SELECT t1.month,

2 MIN(area) keep(dense_rank FIRST ORDER BY amount DESC) max_area,

3 MIN(area) keep (dense_rank FIRST ORDER BY amount) min_area

4 FROM testa t1

5 GROUP BY t1.month;

MONTH MAX_AREA MIN_AREA

-------------------- -------------------- --------------------

1 北京 廣州

2 北京 廣州

3 上海 上海

4 上海 上海

二.求累積銷售額

需求:求每個區(qū)域每個月的銷售額以及累積銷售額

--傳統(tǒng)寫法,通過表連接 t1.month >= t2.month 及group語句解決

select t1.area,t1.month,t1.amount,sum(t2.amount) cum_amount

from testa t1

left join testa t2

on t1.area = t2.area

and t1.month >= t2.month

group by t1.area,t1.month,t1.amount

order by t1.area,t1.month;

--通過sum聚合函數(shù)與分析函數(shù)配合使用,代碼更簡潔易懂

select t1.area,

t1.month,

t1.amount,

sum(t1.amount) over(partition by t1.area order by month) cum_amount

from testa t1

order by t1.area,t1.month;

SQL> --傳統(tǒng)寫法,通過表連接 t1.month >= t2.month 及group語句解決

SQL> select t1.area,t1.month,t1.amount,sum(t2.amount) cum_amount

2 from testa t1

3 left join testa t2

4 on t1.area = t2.area

5 and t1.month >= t2.month

6 group by t1.area,t1.month,t1.amount

7 order by t1.area,t1.month;

AREA MONTH AMOUNT CUM_AMOUNT

-------------------- -------------------- ---------- ----------

北京 1 235 235

北京 2 330 565

廣州 1 75 75

廣州 2 67 142

上海 1 199 199

上海 2 199 398

上海 3 155 1416

上海 4 125 833

8 rows selected

SQL> --通過sum聚合函數(shù)與分析函數(shù)配合使用,代碼更簡潔易懂

SQL> select t1.area,

2 t1.month,

3 t1.amount,

4 sum(t1.amount) over(partition by t1.area order by month) cum_amount

5 from testa t1

6 order by t1.area,t1.month;

AREA MONTH AMOUNT CUM_AMOUNT

-------------------- -------------------- ---------- ----------

北京 1 235 235

北京 2 330 565

廣州 1 75 75

廣州 2 67 142

上海 1 199 199

上海 2 199 398

上海 3 155 708

上海 3 155 708

上海 4 125 833

9 rows selected

正在跳轉(zhuǎn)(iOS交流裙 密碼:123)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末个曙,一起剝皮案震驚了整個濱河市锈嫩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垦搬,老刑警劉巖祠挫,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悼沿,居然都是意外死亡,警方通過查閱死者的電腦和手機骚灸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門糟趾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事义郑〉粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵非驮,是天一觀的道長交汤。 經(jīng)常有香客問我,道長劫笙,這世上最難降的妖魔是什么芙扎? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮填大,結(jié)果婚禮上戒洼,老公的妹妹穿的比我還像新娘。我一直安慰自己允华,他們只是感情好圈浇,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靴寂,像睡著了一般磷蜀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上百炬,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天褐隆,我揣著相機與錄音,去河邊找鬼收壕。 笑死妓灌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蜜宪。 我是一名探鬼主播妇蛀,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拟逮!你這毒婦竟也來了细燎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澳窑,失蹤者是張志新(化名)和其女友劉穎斧散,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摊聋,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鸡捐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了麻裁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箍镜。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡源祈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出色迂,到底是詐尸還是另有隱情香缺,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布歇僧,位于F島的核電站图张,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诈悍。R本人自食惡果不足惜祸轮,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望写隶。 院中可真熱鬧倔撞,春花似錦、人聲如沸慕趴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冕房。三九已至躏啰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耙册,已是汗流浹背给僵。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留详拙,地道東北人帝际。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像饶辙,于是被迫代替她去往敵國和親蹲诀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355