亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle查詢中OVER (PARTITION BY ..)用法

2024-08-29 14:00:55
字體:
來源:轉載
供稿:網友

為了方便大家學習和測試,所有的例子都是在Oracle自帶用戶Scott下建立的。

注:標題中的紅色order by是說明在使用該方法的時候必須要帶上order by。

一、rank()/dense_rank() over(partition by ...order by ...)

現在客戶有這樣一個需求,查詢每個部門工資最高的雇員的信息,相信有一定oracle應用知識的同學都能寫出下面的SQL語句:

select e.ename, e.job, e.sal, e.deptno  from scott.emp e,     (select e.deptno, max(e.sal) sal from scott.emp e group by e.deptno) me  where e.deptno = me.deptno   and e.sal = me.sal; 

在滿足客戶需求的同時,大家應該習慣性的思考一下是否還有別的方法。這個是肯定的,就是使用本小節標題中rank() over(partition by...)或dense_rank() over(partition by...)語法,SQL分別如下:

select e.ename, e.job, e.sal, e.deptno  from (select e.ename,         e.job,         e.sal,         e.deptno,         rank() over(partition by e.deptno order by e.sal desc) rank      from scott.emp e) e  where e.rank = 1; 
select e.ename, e.job, e.sal, e.deptno  from (select e.ename,         e.job,         e.sal,         e.deptno,         dense_rank() over(partition by e.deptno order by e.sal desc) rank      from scott.emp e) e  where e.rank = 1; 

為什么會得出跟上面的語句一樣的結果呢?這里補充講解一下rank()/dense_rank() over(partition by e.deptno order by e.sal desc)語法。

over: 在什么條件之上。

partition by e.deptno: 按部門編號劃分(分區)。

order by e.sal desc: 按工資從高到低排序(使用rank()/dense_rank() 時,必須要帶order by否則非法)

rank()/dense_rank(): 分級

整個語句的意思就是:在按部門劃分的基礎上,按工資從高到低對雇員進行分級,“級別”由從小到大的數字表示(最小值一定為1)。

那么rank()和dense_rank()有什么區別呢?

rank(): 跳躍排序,如果有兩個第一級時,接下來就是第三級。

dense_rank(): 連續排序,如果有兩個第一級時,接下來仍然是第二級。

小作業:查詢部門最低工資的雇員信息。

二、min()/max() over(partition by ...)

現在我們已經查詢得到了部門最高/最低工資,客戶需求又來了,查詢雇員信息的同時算出雇員工資與部門最高/最低工資的差額。這個還是比較簡單,在第一節的groupby語句的基礎上進行修改如下:

select e.ename,      e.job,      e.sal,      e.deptno,      e.sal - me.min_sal diff_min_sal,      me.max_sal - e.sal diff_max_sal   from scott.emp e,      (select e.deptno, min(e.sal) min_sal, max(e.sal) max_sal       from scott.emp e       group by e.deptno) me   where e.deptno = me.deptno   order by e.deptno, e.sal;

上面我們用到了min()和max(),前者求最小值,后者求最大值。如果這兩個方法配合over(partition by ...)使用會是什么效果呢?大家看看下面的SQL語句:

select e.ename,     e.job,     e.sal,     e.deptno,     nvl(e.sal - min(e.sal) over(partition by e.deptno), 0) diff_min_sal,     nvl(max(e.sal) over(partition by e.deptno) - e.sal, 0) diff_max_sal  from scott.emp e;

這兩個語句的查詢結果是一樣的,大家可以看到min()和max()實際上求的還是最小值和最大值,只不過是在partition by分區基礎上的。

小作業:如果在本例中加上order by,會得到什么結果呢?

三、lead()/lag() over(partition by ... order by ...)

中國人愛攀比,好面子,聞名世界??蛻舾呛眠@一口,在和最高/最低工資比較完之后還覺得不過癮,這次就提出了一個比較變態的需求,計算個人工資與比自己高一位/低一位工資的差額。這個需求確實讓我很是為難,在groupby語句中不知道應該怎么去實現。不過。。?!,F在我們有了over(partition by ...),一切看起來是那么的簡單。如下:

select e.ename,     e.job,     e.sal,     e.deptno,     lead(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lead_sal,     lag(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lag_sal,     nvl(lead(e.sal) over(partition by e.deptno order by e.sal) - e.sal,       0) diff_lead_sal,     nvl(e.sal - lag(e.sal) over(partition by e.deptno order by e.sal), 0) diff_lag_sal  from scott.emp e; 

看了上面的語句后,大家是否也會覺得虛驚一場呢(驚出一身冷汗后突然雞凍起來,這樣容易感冒)?我們還是來講解一下上面用到的兩個新方法吧。

lead(列名,n,m): 當前記錄后面第n行記錄的<列名>的值,沒有則默認值為m;如果不帶參數n,m,則查找當前記錄后面第一行的記錄<列名>的值,沒有則默認值為null。

lag(列名,n,m): 當前記錄前面第n行記錄的<列名>的值,沒有則默認值為m;如果不帶參數n,m,則查找當前記錄前面第一行的記錄<列名>的值,沒有則默認值為null。

下面再列舉一些常用的方法在該語法中的應用(注:帶order by子句的方法說明在使用該方法的時候必須要帶order by):

select e.ename,     e.job,     e.sal,     e.deptno,     first_value(e.sal) over(partition by e.deptno) first_sal,     last_value(e.sal) over(partition by e.deptno) last_sal,     sum(e.sal) over(partition by e.deptno) sum_sal,     avg(e.sal) over(partition by e.deptno) avg_sal,     count(e.sal) over(partition by e.deptno) count_num,     row_number() over(partition by e.deptno order by e.sal) row_num  from scott.emp e; 

大家在讀完本片文章之后可能會有點誤解,就是OVER (PARTITION BY ..)比GROUP BY更好,實際并非如此,前者不可能替代后者,而且在執行效率上前者也沒有后者高,只是前者提供了更多的功能而已,所以希望大家在使用中要根據需求情況進行選擇。

 

注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品综合久久中文字幕| 91精品国产色综合久久不卡98| 欧美性生交xxxxxdddd| 日韩精品极品视频免费观看| 久久久久久成人精品| 欧洲亚洲妇女av| 色多多国产成人永久免费网站| 91精品国产色综合久久不卡98| 精品久久久久国产| 亚洲免费视频一区二区| 日韩激情视频在线播放| 成人免费在线网址| 这里精品视频免费| 国产午夜精品理论片a级探花| 亚洲国产高潮在线观看| 中日韩午夜理伦电影免费| 亚洲色图狂野欧美| 欧美在线视频导航| 亚洲欧洲美洲在线综合| 国产在线播放91| 51视频国产精品一区二区| 精品视频久久久久久| 国产欧美最新羞羞视频在线观看| 久久免费视频观看| 日韩免费观看av| 亚洲成人久久一区| 日韩中文视频免费在线观看| 欧美另类极品videosbest最新版本| 国产精品一区二区久久| 欧美日韩第一页| 97免费视频在线| 欧美成人激情在线| 亚洲精品免费在线视频| 国产视频丨精品|在线观看| 国产精欧美一区二区三区| 亚洲天堂男人天堂女人天堂| 欧美精品video| 色综合久久天天综线观看| 亚洲欧美国产一区二区三区| 色久欧美在线视频观看| 欧美精品一区二区免费| 国产亚洲aⅴaaaaaa毛片| 亚洲片av在线| 日韩成人免费视频| 中文字幕精品影院| 国产免费一区二区三区在线观看| 中文字幕精品在线视频| 国产精品扒开腿做爽爽爽视频| 亚洲永久在线观看| 欧美日韩亚洲一区二区| 夜夜躁日日躁狠狠久久88av| 欧美高跟鞋交xxxxhd| 欧美尺度大的性做爰视频| 亚洲风情亚aⅴ在线发布| 81精品国产乱码久久久久久| 亚洲人成自拍网站| 欧美中文在线字幕| 精品国产自在精品国产浪潮| 亚洲乱码国产乱码精品精天堂| 精品动漫一区二区| 91成品人片a无限观看| 精品国产精品三级精品av网址| 欧美人与性动交| 亚洲日本aⅴ片在线观看香蕉| 国产精品一久久香蕉国产线看观看| 韩国欧美亚洲国产| 国产欧美一区二区| 欧美在线国产精品| 91精品国产网站| 懂色av影视一区二区三区| 2025国产精品视频| 在线精品国产欧美| 国产成人亚洲综合91精品| 97精品一区二区视频在线观看| 性色av一区二区三区免费| 日本午夜在线亚洲.国产| 高清日韩电视剧大全免费播放在线观看| 国内精品伊人久久| 少妇久久久久久| 国产91久久婷婷一区二区| 日韩电视剧免费观看网站| 亚洲已满18点击进入在线看片| 97国产精品视频| 国产精品网站入口| 日韩欧美在线播放| 亚洲香蕉av在线一区二区三区| 国产精品视频专区| 国产精品国语对白| 亚洲系列中文字幕| 欧美日韩在线观看视频小说| 国产在线一区二区三区| 色一区av在线| 国产男人精品视频| 亚洲最新在线视频| 国产精品99蜜臀久久不卡二区| 欧美国产在线电影| 91免费版网站入口| 青草热久免费精品视频| 亚洲国产中文字幕在线观看| 久久久久久久久久久亚洲| 亚洲综合在线中文字幕| 午夜精品久久久久久久99热| 久久久久久97| 91免费国产视频| 91久久久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 日本成人精品在线| 韩剧1988在线观看免费完整版| 国产精品视频一区二区三区四| 91中文在线观看| 日本aⅴ大伊香蕉精品视频| 奇米一区二区三区四区久久| 91成人在线播放| 欧美精品在线观看91| 亚洲精品国产精品乱码不99按摩| 亚洲一区二区在线播放| 成人两性免费视频| 国产日韩欧美视频在线| 日本午夜人人精品| 在线日韩日本国产亚洲| 97av在线播放| 亚洲精品av在线| 日韩在线观看免费高清| 国语自产精品视频在线看| 日日噜噜噜夜夜爽亚洲精品| 精品久久久久久中文字幕大豆网| 亚洲一区二区福利| 久久久人成影片一区二区三区| 亚洲电影免费观看高清完整版| 疯狂蹂躏欧美一区二区精品| 中文字幕精品视频| 亚洲成人久久久| 国产精自产拍久久久久久蜜| 一区二区三区回区在观看免费视频| 精品久久久久久久久久久久久久| 亚洲欧美日韩爽爽影院| 国产va免费精品高清在线观看| 精品久久久久久久久久久| 久久久久久久香蕉网| 亚洲天堂精品在线| 日韩中文字幕视频| 成人黄色片在线| 国产视频福利一区| 色琪琪综合男人的天堂aⅴ视频| 国产精品免费观看在线| 一区二区三区回区在观看免费视频| 亚洲欧美在线免费观看| 国产免费亚洲高清| 欧美午夜精品伦理| 日韩av不卡在线| 欧美激情视频播放| 欧美性猛交xxxx乱大交极品| 国产精品日日摸夜夜添夜夜av| 亚洲区一区二区| 欧美激情欧美激情| 久久91亚洲精品中文字幕| 美女扒开尿口让男人操亚洲视频网站| 懂色av影视一区二区三区| 日韩欧美成人精品| 中文字幕日韩精品有码视频| 中文字幕久热精品视频在线| 久久久免费观看视频| 精品国产美女在线| 日韩日本欧美亚洲|