1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Oracle高級查詢之OVER(PARTITIONBY..)

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

      創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站設計制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的德令哈網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

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

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

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

      [sql] view plaincopy

      1. select e.ename, e.job, e.sal, e.deptno  

      2.   from scott.emp e,  

      3.        (select e.deptno, max(e.sal) sal from scott.emp e group by e.deptno) me  

      4.  where e.deptno = me.deptno  

      5.    and e.sal = me.sal;  

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

      [sql] view plaincopy

      1. select e.ename, e.job, e.sal, e.deptno  

      2.   from (select e.ename,  

      3.                e.job,  

      4.                e.sal,  

      5.                e.deptno,  

      6.                rank() over(partition by e.deptno order by e.sal desc) rank  

      7.           from scott.emp e) e  

      8.  where e.rank = 1;  

      [sql] view plaincopy

      1. select e.ename, e.job, e.sal, e.deptno  

      2.   from (select e.ename,  

      3.                e.job,  

      4.                e.sal,  

      5.                e.deptno,  

      6.                dense_rank() over(partition by e.deptno order by e.sal desc) rank  

      7.           from scott.emp e) e  

      8.  where e.rank = 1;  

      為什么會得出跟上面的語句一樣的結(jié)果呢?這里補充講解一下rank()/dense_rank() over(partition by e.deptno order by e.sal desc)語法。
      over:  在什么條件之上。
      partition by e.deptno:  按部門編號劃分(分區(qū))。
      order by e.sal desc:  按工資從高到低排序(使用rank()/dense_rank() 時,必須要帶order by否則非法)
      rank()/dense_rank():  分級
      整個語句的意思就是:在按部門劃分的基礎上,按工資從高到低對雇員進行分級,“級別”由從小到大的數(shù)字表示(最小值一定為1)。 

      那么rank()和dense_rank()有什么區(qū)別呢?
      rank():  跳躍排序,如果有兩個第一級時,接下來就是第三級。
      dense_rank():  連續(xù)排序,如果有兩個第一級時,接下來仍然是第二級。

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

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

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

      [sql] view plaincopy

      1. select e.ename,  

      2.          e.job,  

      3.          e.sal,  

      4.          e.deptno,  

      5.          e.sal - me.min_sal diff_min_sal,  

      6.          me.max_sal - e.sal diff_max_sal  

      7.     from scott.emp e,  

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

      9.             from scott.emp e  

      10.            group by e.deptno) me  

      11.    where e.deptno = me.deptno  

      12.    order by e.deptno, e.sal;  

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

      [sql] view plaincopy

      1. select e.ename,  

      2.        e.job,  

      3.        e.sal,  

      4.        e.deptno,  

      5.        nvl(e.sal - min(e.sal) over(partition by e.deptno), 0) diff_min_sal,  

      6.        nvl(max(e.sal) over(partition by e.deptno) - e.sal, 0) diff_max_sal  

      7.   from scott.emp e;  

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

      小作業(yè):如果在本例中加上order by,會得到什么結(jié)果呢?

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

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

      [sql] view plaincopy

      1. select e.ename,  

      2.        e.job,  

      3.        e.sal,  

      4.        e.deptno,  

      5.        lead(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lead_sal,  

      6.        lag(e.sal, 1, 0) over(partition by e.deptno order by e.sal) lag_sal,  

      7.        nvl(lead(e.sal) over(partition by e.deptno order by e.sal) - e.sal,  

      8.            0) diff_lead_sal,  

      9.        nvl(e.sal - lag(e.sal) over(partition by e.deptno order by e.sal), 0) diff_lag_sal  

      10.   from scott.emp e;   

      看了上面的語句后,大家是否也會覺得虛驚一場呢(驚出一身冷汗后突然雞凍起來,這樣容易感冒)?我們還是來講解一下上面用到的兩個新方法吧。
      lead(列名,n,m):  當前記錄后面第n行記錄的<列名>的值,沒有則默認值為m;如果不帶參數(shù)n,m,則查找當前記錄后面第一行的記錄<列名>的值,沒有則默認值為null
      lag(列名,n,m):  當前記錄前面第n行記錄的<列名>的值,沒有則默認值為m;如果不帶參數(shù)n,m,則查找當前記錄前面第一行的記錄<列名>的值,沒有則默認值為null

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

      [sql] view plaincopy

      1. select e.ename,  

      2.        e.job,  

      3.        e.sal,  

      4.        e.deptno,  

      5.        first_value(e.sal) over(partition by e.deptno) first_sal,  

      6.        last_value(e.sal) over(partition by e.deptno) last_sal,  

      7.        sum(e.sal) over(partition by e.deptno) sum_sal,  

      8.        avg(e.sal) over(partition by e.deptno) avg_sal,  

      9.        count(e.sal) over(partition by e.deptno) count_num,  

      10.        row_number() over(partition by e.deptno order by e.sal) row_num  

      11.   from scott.emp e;  


      網(wǎng)頁標題:Oracle高級查詢之OVER(PARTITIONBY..)
      標題鏈接:http://www.ef60e0e.cn/article/jdohid.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        华蓥市| 清流县| 康保县| 拉萨市| 太湖县| 云安县| 芮城县| 安多县| 甘德县| 故城县| 布拖县| 乃东县| 上饶县| 泾源县| 綦江县| 安顺市| 昌宁县| 且末县| 惠来县| 晋江市| 吴桥县| 罗田县| 东乡族自治县| 沙湾县| 乡城县| 静宁县| 元朗区| 通榆县| 湖北省| 衡水市| 新巴尔虎右旗| 丘北县| 榕江县| 定襄县| 互助| 马龙县| 临西县| 古蔺县| 靖远县| 岳阳县| 桦南县|