分析函數排序

一、使用分析函數來爲記錄排名:

Rank,Dense_Rank,Row_Number

rank():主要用於排序,並給出序號。在排序後對相同的數據給予相同序號,接下來的序號直接跳躍
dense_rank():功能同rank()一樣,區別在於:在排序後對相同的數據給予相同序號,接下來的序號不跳躍
row_number():按照順序依次使用,相當於我們普通查詢裏的rownum值

另一種理解

①ROW_NUMBER:
Row_number函數返回一個唯一的值,當碰到相同數據時,排名按照記錄集中記錄的順序依次遞增。
②DENSE_RANK:
Dense_rank函數返回一個唯一的值,除非當碰到相同數據時,此時所有相同數據的排名都是一樣的。
③RANK:
Rank函數返回一個唯一的值,除非遇到相同的數據時,此時所有相同數據的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。


如:
1,2,2,4,5,6...這是rank()的形式
1,2,2,3,4,5...這是dense_rank()的形式
1,2,3,4,5,6...這是row_number()的形式

實例:
SQL> select deptno,ename,sal,
                row_number()  over ( order by sal desc ) row_num,
                rank() over ( order by sal desc) rank,
                dense_rank() over(order by sal desc) dense_rank
           from emp;
 
DEPTNO ENAME   SAL   ROW_NUM  RANK DENSE_RANK
------ ---------- --------- ---------- ---------- ----------
    10 KING           5000.00           1          1              1
    20 FORD         3000.00           2          2              2
    20 SCOTT       3000.00           3          2              2
    30 BLAKE        2850.00           4          4              3
    10 CLARK       2450.00           5          5              4
    20 JONES       2053.80           6          6              5
    30 ALLEN        600.00             7          7              6
    30 TURNER   1500.00            8          8             7
    30 MARTIN     1250.00            9          9             8
    30 WARD         250.00          10           9             8
    10 MILLER      1114.59         11         11            9
    20 ADAMS       1100.00         12         12         10
    30 JAMES        950.00           13         13         11
    20 SMITH         800.00           14         14         12
 
14 rows selected

二、使用分析函數爲記錄進行分組排名:

下面這條語句爲了查詢做分組排名的效果:

SQL> select deptno,ename,sal,(select count(*)+1 from emp b where b.deptno=a.deptno and b.sal>a.sal ) rownumber from emp a order by deptno,sal desc;
 
DEPTNO ENAME            SAL  ROWNUMBER
------ ---------- --------- ----------
    10 KING                    5000.00          1
    10 CLARK                2450.00          2
    10 MILLER               1114.59          3
    20 SCOTT                3000.00          1
    20 FORD                  3000.00          1
    20 JONES                2053.80          3
    20 ADAMS                1100.00          4
    20 SMITH                    800.00          5
    30 BLAKE                 2850.00          1
    30 ALLEN                 1600.00          2
    30 TURNER             1500.00          3
    30 MARTIN               1250.00          4
    30 WARD                  1250.00          4
    30 JAMES                    950.00          6
 
14 rows selected

以下爲分析函數分組排名:

SQL> select deptno,ename,sal,
                row_number()  over (partition by deptno order by sal desc ) row_number,
                rank() over (partition by deptno order by sal desc) rank,
                dense_rank() over(partition by deptno order by sal desc) dense_rank
          from emp  order by deptno,sal desc;
 
DEPTNO ENAME       SAL   ROW_NUMBER       RANK         DENSE_RANK
------ ---------- --------- ---------- ---------- ----------
    10 KING                5000.00                  1                  1                  1
    10 CLARK            2450.00                  2                   2                  2
    10 MILLER           1114.59                  3                   3                  3
    20 FORD              3000.00                  1                   1                  1
    20 SCOTT            3000.00                  2                   1                  1
    20 JONES            2053.80                  3                   3                  2
    20 ADAMS           1100.00                   4                   4                  3
    20 SMITH             800.00                     5                   5                  4
    30 BLAKE            2850.00                   1                   1                  1
    30 ALLEN           1600.00                    2                   2                  2
    30 TURNER       1500.00                    3                   3                  3
    30 MARTIN         1250.00                    4                   4                  4
    30 WARD           1250.00                     5                   4                  4
    30 JAMES           950.00                       6                   6                  5
 
14 rows selected

三、使用rownum爲記錄排名:

SQL> select rownum,t.empno,t.ename,t.sal from (select * from emp order by sal desc) t where rownum<=12 order by t.sal desc;
 
    ROWNUM EMPNO ENAME            SAL
---------- ----- ---------- ---------
         1               7839    KING            5000.00
         2               7788    SCOTT        3000.00
         3               7902    FORD          3000.00
         4               7698    BLAKE         2850.00
         5               7782    CLARK        2450.00
         6               7566    JONES        2053.80
         7               7499    ALLEN         1600.00
         8               7844    TURNER     1500.00
         9               7521    WARD          1250.00
        10              7654    MARTIN       1250.00
        11              7934    MILLER       1114.59
        12              7876    ADAMS        1100.00
 
12 rows selected

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章