编者按:
本文作者系Scott(中文名陈晓辉),现任大连华信资深分析师 ,ORACLE数据库专家,曾就职于甲骨文中国。个人主页:segmentfault.com/u/db_perf ,经其本人授权发布。
【免责声明】本公众号文章仅代表个人观点,与任何公司无关。
今天讲一下几个排位(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行が選択されました。
后续文章更加精彩,欢迎关注本公众号或访问【阅读原文】。
——End——
专注于技术不限于技术!
用碎片化的时间,一点一滴地提高数据库技术和个人能力。
欢迎关注!
手把手系列(帮助个人技术成长):
手把手教你在Windows 10安装Oracle 19c(详细图文附踩坑指南)
【SQL】实时SQL监控功能(Real-Time SQL Monitoring)
【SQL】历史SQL监控(Historical SQL Monitoring ) 功能(12c)
Oracle SQL 性能调优:使用Hint固定执行计划1(Hash Join)
Oracle SQL 性能调优:使用Hint固定执行计划2(Nested Loop Join)
Oracle SQL 基础(学习SQL的写法):
最后修改时间:2021-04-24 10:57:59
文章转载自Oracle数据库技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。