婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Oracle查詢中OVER (PARTITION BY ..)用法

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

熱門標簽:圖像地圖標注 貴陽電話外呼系統哪家好 呼倫貝爾智能手機地圖標注 濟南地圖標注公司 南寧人工智能電銷機器人費用 安陽外呼系統免費 分布式呼叫中心 海南400電話哪里辦理 400電話是不是免費申請

為了方便大家學習和測試,所有的例子都是在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語句中不知道應該怎么去實現。不過。。。。現在我們有了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查詢中OVER (PARTITION BY ..)用法》,本文關鍵詞  Oracle,查詢,中,OVER,PARTITION,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle查詢中OVER (PARTITION BY ..)用法》相關的同類信息!
  • 本頁收集關于Oracle查詢中OVER (PARTITION BY ..)用法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产成人综合在线| 91精品国产一区二区| 精品国产网站在线观看| 成人免费在线播放视频| 欧美日韩中文一区| 91视频在线观看免费| 在线观看国产日韩| 欧美电影免费观看高清完整版在线| a4yy欧美一区二区三区| 欧美理论在线播放| 国内成人免费视频| 国产不卡在线播放| 亚洲一区二区三区精品在线| 91欧美激情一区二区三区成人| 成人黄色国产精品网站大全在线免费观看| 成人动漫一区二区| 国产精品素人一区二区| 男女性色大片免费观看一区二区 | 麻豆久久一区二区| 在线观看欧美日本| 日韩高清欧美激情| 制服丝袜一区二区三区| 日本欧美韩国一区三区| 日韩欧美国产一区二区在线播放| 麻豆精品新av中文字幕| 欧美一区2区视频在线观看| 亚洲一区影音先锋| 欧美另类z0zxhd电影| 亚洲国产精品久久人人爱| 国产v综合v亚洲欧| 亚洲欧美在线观看| 99在线精品免费| 亚洲欧美在线视频观看| 国产精品一区二区不卡| 久久众筹精品私拍模特| 国产精品夫妻自拍| 欧美喷水一区二区| 一区二区三区91| 欧美日韩三级一区二区| 天天爽夜夜爽夜夜爽精品视频 | 91免费看`日韩一区二区| 欧美一级高清片| 亚洲一区二区三区免费视频| 99久久精品一区| av成人免费在线| 久久精品男人的天堂| 国产一区二区三区美女| 亚洲女同ⅹxx女同tv| 午夜欧美2019年伦理| 欧美精选一区二区| 日韩视频一区二区三区| 欧美日韩1区2区| 99亚偷拍自图区亚洲| 精品无人码麻豆乱码1区2区| 亚洲高清三级视频| 亚洲天堂中文字幕| 性做久久久久久免费观看欧美| 国产女主播一区| 国产亚洲欧美日韩俺去了| 欧美色老头old∨ideo| 91视频xxxx| 国产成人精品综合在线观看 | 欧美日韩亚洲综合| 91麻豆产精品久久久久久| 国产露脸91国语对白| 在线观看国产91| 欧美精品一区二区三区高清aⅴ| 欧美韩国一区二区| 韩国一区二区三区| 欧美挠脚心视频网站| 国产精品午夜在线| 久久精品国产亚洲一区二区三区| 成人av电影免费在线播放| 日韩视频一区二区| 午夜一区二区三区视频| 成人精品gif动图一区| 日韩一区二区三区电影| 国产精品五月天| 韩国女主播一区| 欧美视频精品在线| 中文字幕免费一区| 午夜成人在线视频| 欧美色视频一区| 樱花草国产18久久久久| 成人在线一区二区三区| 精品久久久久久久久久久久包黑料| 久久国产精品区| 国产黄色91视频| 国产精品午夜久久| 99久久精品99国产精品| 中文字幕一区二区5566日韩| 国产成人精品网址| 亚洲私人黄色宅男| 欧美亚洲免费在线一区| 免费高清不卡av| 国产精品麻豆网站| 欧美亚洲自拍偷拍| 亚洲伦在线观看| 成人免费毛片a| 久久男人中文字幕资源站| 日韩电影在线一区二区| 3d动漫精品啪啪一区二区竹菊| 亚洲一区二区免费视频| 久久久久国产精品麻豆ai换脸| 日本女人一区二区三区| 中文字幕+乱码+中文字幕一区| 福利一区福利二区| 激情小说欧美图片| 久久综合久久综合久久综合| 免费成人在线影院| 国产精品短视频| 91精品国产综合久久福利| 日韩国产在线观看| 国产精品视频免费看| 中文字幕第一区| 波多野结衣中文字幕一区二区三区 | 国产午夜精品在线观看| 精品三级在线看| 欧美本精品男人aⅴ天堂| 欧美日韩一区在线观看| 麻豆传媒一区二区三区| 日本欧美韩国一区三区| 麻豆国产精品777777在线| 国产精品二三区| 国产精品三级电影| 亚洲色图制服丝袜| 一区二区三区在线免费播放| 亚洲综合精品自拍| 久久国产视频网| 国产成人三级在线观看| 99re亚洲国产精品| 6080国产精品一区二区| 欧美三级日韩三级国产三级| 成人app软件下载大全免费| 成人免费高清在线观看| 欧美探花视频资源| 欧美三级韩国三级日本一级| 日韩三级视频中文字幕| 亚洲欧美日韩综合aⅴ视频| 亚洲在线视频一区| 国产成都精品91一区二区三| 国产精品白丝av| 成人小视频在线| 懂色av一区二区在线播放| 色狠狠色狠狠综合| 久久色在线视频| 奇米在线7777在线精品| 成人app网站| 亚洲欧洲精品一区二区三区 | 丁香激情综合五月| 高清不卡在线观看| 色婷婷一区二区| 欧美电影免费观看高清完整版在线观看 | 国产不卡免费视频| 国产真实乱子伦精品视频| 国产经典欧美精品| 国产精品视频观看| 成人午夜伦理影院| 综合久久久久久久| 欧美午夜精品久久久久久超碰| 一区二区三区四区视频精品免费| 色综合一个色综合亚洲| 亚洲同性gay激情无套| 在线中文字幕不卡| 亚洲一区二区三区中文字幕| 欧美色倩网站大全免费| 亚洲一区二区三区美女| 91视频在线观看| 一色屋精品亚洲香蕉网站| 99国产欧美久久久精品| 国产精品视频看| 韩国av一区二区三区| 日韩一区二区免费高清| 狠狠色丁香婷婷综合| 中文字幕精品一区二区三区精品| 精品亚洲aⅴ乱码一区二区三区| 欧美肥胖老妇做爰| 亚洲国产精品久久人人爱蜜臀 | 欧美日韩综合色| 日韩制服丝袜先锋影音| 成人黄色777网| 亚洲国产一区二区视频| 日韩一区二区三区在线观看| 亚洲黄色小说网站| 日本成人中文字幕| 日韩精品一区二区三区在线| 成人av资源在线观看| 精品一区二区在线观看| 亚洲成年人影院| 制服丝袜在线91| 精品一区二区三区免费视频| 欧美精品一区二区三区在线播放 | av在线一区二区三区| 久久电影网电视剧免费观看| 亚洲激情一二三区| 中文字幕一区二区三区av| 久久精品亚洲一区二区三区浴池| 91精品国产乱码久久蜜臀| 欧美性大战久久久久久久| 欧美男生操女生|