Oracle ---- 窗口函数

Posted Scott

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle ---- 窗口函数相关的知识,希望对你有一定的参考价值。

今天讲一下几个排位(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 a30
SQL> set lin 120 pages 999
SQL> SELECT deptno, ename, sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rank
FROM 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          6

14行が選択されました。

再来看看DENSE_RANK的情况。

SQL> SELECT deptno, ename, sal,
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rank
FROM 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          5

14行が選択されました。

对比一下有啥区别。

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          5

DENSE_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 rank
FROM 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          6

14行が選択されました。

2021/04/16 @ Dalian

以上是关于Oracle ---- 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Toad for Oracle 中使用自定义代码片段?

Oracle ---- 窗口函数

Oracle ---- 窗口函数

Oracle ---- 窗口函数

Oracle开发之窗口函数 rows between unbounded preceding and current row

Oracle 分析窗口函数