暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL 基础:窗口函数(二)RANK函数如何使用窗口函数

1533

编者按:

本文作者系Scott(中文名陈晓辉),现任大连华信资深分析师 ,ORACLE数据库专家,曾就职于甲骨文中国。个人主页:segmentfault.com/u/db_perf ,经其本人授权发布。

【免责声明】本公众号文章仅代表个人观点,与任何公司无关。

Oracle SQL 基础:窗口函数(一)over()函数

今天讲一下几个排位(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(详细图文附踩坑指南)

在线Oracle SQL学习环境--Live SQL

SQL调优和诊断从哪入手?

获取SQL执行计划最基础的方法是啥?

一学就会的获取SQL执行计划和性能统计信息的方法

【SQL】实时SQL监控功能(Real-Time SQL Monitoring)

【SQL】历史SQL监控(Historical SQL Monitoring ) 功能(12c)

获取历史执行计划:AWR/StatsPack SQL 报告

供收藏:Oracle固定SQL执行计划的方法总结

Oracle SQL 性能调优:使用Hint固定执行计划1(Hash Join)

Oracle SQL 性能调优:使用Hint固定执行计划2(Nested Loop Join)

Oracle SQL 性能调优:使用SqlPatch固定执行计划

Oracle SQL 性能调优:使用SqlPatch固定执行计划(二)19c

Oracle SQL 基础(学习SQL的写法):

Oracle SQL 基础:窗口函数(一)over()函数

最后修改时间:2021-04-24 10:57:59
文章转载自Oracle数据库技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论