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开发之窗口函数 rows between unbounded preceding and current row