使用Oracle的分析函数ROW_NUMBER、DENSE_RANK、RANK

简介:
 

这三个分析函数都可以在各个分组内从1开始排序。
ROW_NUMBER()是没有重复值的,可以利用它实现分页显示。
DENSE_RANK()是连续排序,有两个第二名时仍然跟着第三名。
RANK()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。

SELECT * FROM (
     SELECT deptno, ename, sal, ROW_NUMBER()
     OVER (
       PARTITION BY deptno ORDER BY sal DESC
     ) Top3 FROM emp
)
WHERE Top3 <= 3

/

    DEPTNO ENAME                SAL          TOP3
---------- ---------- ---------- ----------
           10 KING                   5000             1
           10 CLARK               2450             2
           10 MILLER              1300             3

           20 SCOTT               3000             1
           20 FORD                 3000             2
           20 JONES                2975             3

           30 BLAKE               2850             1
           30 ALLEN               1600             2
           30 TURNER            1500             3

9 rows selected.

 

SELECT * FROM (
     SELECT deptno, ename, sal, DENSE_RANK()
     OVER (
       PARTITION BY deptno ORDER BY sal DESC
     ) TopN FROM emp
)
WHERE TopN <= 3
ORDER BY deptno, sal DESC
/


       DEPTNO ENAME                SAL          TOPN
---------- ---------- ---------- ----------
           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

           30 BLAKE               2850             1
           30 ALLEN               1600             2
           30 TURNER            1500             3


10 rows selected.

 

SELECT * FROM (
     SELECT deptno, ename, sal, RANK()
     OVER (
       PARTITION BY deptno ORDER BY sal DESC
     ) TopN FROM emp
)
WHERE TopN <= 3
ORDER BY deptno, sal DESC
/


       DEPTNO ENAME                SAL          TOPN
---------- ---------- ---------- ----------
           10 KING                   5000             1
           10 CLARK               2450             2
           10 MILLER              1300             3

       
   20 SCOTT               3000            1     <--- !
          20 FORD                 3000           1     <--- !

           20 JONES               2975            3

           30 BLAKE               2850             1
           30 ALLEN               1600             2
           30 TURNER            1500             3

分类:  Oracle

本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/archive/2007/06/26/795832.html,如需转载请自行联系原作者
相关文章
|
4月前
|
SQL 存储 Oracle
【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写
【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写
|
10月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
1768 3
|
12月前
|
SQL Oracle 关系型数据库
|
12月前
|
Oracle 关系型数据库 数据挖掘
|
12月前
|
SQL Oracle 算法
|
12月前
|
Oracle 关系型数据库 数据挖掘
|
SQL Oracle 关系型数据库
Oracle|内置函数之INSTR
【7月更文挑战第5天】
|
存储 Oracle NoSQL
Oracle中decode函数详解
Oracle中decode函数详解
|
1月前
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。