隨筆-314  評論-209  文章-0  trackbacks-0

          轉:本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/huanghui22/archive/2007/05/03/1595166.aspx


          有些時候我們希望得到指定數據中的前n列,示例如下:

          得到每個部門薪水最高的三個雇員:

          先創建示例表

          create table emp
          as
          select * from scott.emp;

          alter table emp
          add constraint emp_pk
          primary key(empno);

          create table dept
          as
          select * from scott.dept;

          alter table dept
          add constraint dept_pk
          primary key(deptno);

          先看一下row_number() /rank()/dense_rank()三個函數之間的區別

           select emp.deptno,emp.sal,emp.empno,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
            rank() over (partition by deptno order by sal desc) rank, --1,1,3
            dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
          結果如下:

          10    5000.00    7839    1    1    1
          10    2450.00    7782    2    2    2
          10    1300.00    7934    3    3    3
          20    3000.00    7788    1    1    1
          20    3000.00    7902    2    1    1
          20    2975.00    7566    3    3    2
          20    1100.00    7876    4    4    3
          20    800.00    7369    5    5    4
          30    2850.00    7698    1    1    1
          30    1600.00    7499    2    2    2
          取每個部門的薪水前三位雇員:

          select t.deptno,t.rank,t.sal from
           (
           select emp.*,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
            rank() over (partition by deptno order by sal desc) rank, --1,1,3
            dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
           ) t
          where t.rank<=3
          結果如下:

          10    1    5000.00
          10    2    2450.00
          10    3    1300.00
          20    1    3000.00
          20    1    3000.00
          20    3    2975.00
          30    1    2850.00
          30    2    1600.00
          30    3    1500.00
          如果想輸出成deptno  sal1   sal2   sal3這種類型的格式
          步驟一(decode):

          select t.deptno,decode(row_number,1,sal) sal1,decode(row_number,2,sal) sal2,decode(row_number,3,sal) sal3 from
           (
           select emp.*,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
            rank() over (partition by deptno order by sal desc) rank, --1,1,3
            dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
           ) t
          where t.rank<=3

          結果如下:

          10    5000       
          10                  2450   
          10                             1300
          20    3000       
          20                  3000   
          20                              2975
          30    2850       
          30                 1600   
          30                             1500
          步驟二(使用聚合函數去除null,得到最終結果):

          select t.deptno,max(decode(row_number,1,sal)) sal1,max(decode(row_number,2,sal)) sal2,max(decode(row_number,3,sal)) sal3 from
           (
           select emp.*,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
            rank() over (partition by deptno order by sal desc) rank, --1,1,3
            dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
           ) t
          where t.rank<=3
          group by t.deptno
          結果如下:

          10    5000    2450    1300
          20    3000    3000    2975
          30    2850    1600    1500

           

          posted on 2009-09-07 16:45 xzc 閱讀(418) 評論(0)  編輯  收藏 所屬分類: Oracle
          <2009年9月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(12)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乃东县| 屯门区| 仙桃市| 望谟县| 开封县| 集安市| 大方县| 龙海市| 乳山市| 白沙| 白银市| 乐清市| 彩票| 治多县| 镇巴县| 安化县| 兖州市| 庆安县| 丽水市| 高尔夫| 南华县| 台州市| 江孜县| 新巴尔虎左旗| 阿巴嘎旗| 枣强县| 获嘉县| 黄大仙区| 驻马店市| 石林| 金华市| 江永县| 双流县| 台湾省| 鄂伦春自治旗| 岚皋县| 青铜峡市| 江华| 礼泉县| 云南省| 青海省|