明天讲一下几个排位(RANK)函数如何应用窗口函数。

RANK() OVER ( query_partition_clause ORDER_BY clause)DENSE_RANK( ) OVER ( query_partition_clause ORDER_BY clause )

Example

把scott.emp表依照“deptno”分区,分区内再按“sal”排位。

先看看RANK的状况。

SQL> conn scott/triger;接続されました。SQL> col ENAME for a30SQL> set lin 120 pages 999SQL> SELECT deptno, ename, sal,RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rankFROM emp;  2    3    DEPTNO ENAME                                 SAL       RANK---------- ------------------------------ ---------- ----------        10 KING                                 5000          1        10 CLARK                                2450          2        10 MILLER                               1300          3        20 SCOTT                                3000          1        20 FORD                                 3000          1        20 JONES                                2975          3        20 ADAMS                                1100          4        20 SMITH                                 800          5        30 BLAKE                                2850          1        30 ALLEN                                1600          2        30 TURNER                               1500          3        30 MARTIN                               1250          4        30 WARD                                 1250          4        30 JAMES                                 950          614行が選択されました。

再来看看DENSE_RANK的状况。

SQL> SELECT deptno, ename, sal,DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rankFROM emp;  2    3    DEPTNO ENAME                                 SAL       RANK---------- ------------------------------ ---------- ----------        10 KING                                 5000          1        10 CLARK                                2450          2        10 MILLER                               1300          3        20 SCOTT                                3000          1        20 FORD                                 3000          1        20 JONES                                2975          2        20 ADAMS                                1100          3        20 SMITH                                 800          4        30 BLAKE                                2850          1        30 ALLEN                                1600          2        30 TURNER                               1500          3        30 MARTIN                               1250          4        30 WARD                                 1250          4        30 JAMES                                 950          514行が選択されました。

比照一下有啥区别。

RANK:    DEPTNO ENAME                                 SAL       RANK---------- ------------------------------ ---------- ----------        20 SCOTT                                3000          1        20 FORD                                 3000          1    <<<1        20 JONES                                2975          3    <<<3        20 ADAMS                                1100          4        20 SMITH                                 800          5DENSE_RANK:    DEPTNO ENAME                                 SAL       RANK---------- ------------------------------ ---------- ----------        20 SCOTT                                3000          1        20 FORD                                 3000          1    <<<1        20 JONES                                2975          2    <<<2        20 ADAMS                                1100          3        20 SMITH                                 800          4

咱们能够看到应用RANK排位时遇到雷同的排位的话,下个排位是有空位的,而DENSE_RANK是没有空位的。

那么如何依照记录数排位呢?
能够应用ROW_NUMBER当作剖析函数。

SQL> SELECT deptno, ename, sal,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) as rankFROM emp;  2    3    DEPTNO ENAME                                 SAL       RANK---------- ------------------------------ ---------- ----------        10 KING                                 5000          1        10 CLARK                                2450          2        10 MILLER                               1300          3        20 SCOTT                                3000          1        20 FORD                                 3000          2        20 JONES                                2975          3        20 ADAMS                                1100          4        20 SMITH                                 800          5        30 BLAKE                                2850          1        30 ALLEN                                1600          2        30 TURNER                               1500          3        30 MARTIN                               1250          4        30 WARD                                 1250          5        30 JAMES                                 950          614行が選択されました。

2021/04/16 @ Dalian