`
Longmanfei
  • 浏览: 46644 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 的几种排名方式

阅读更多

  在写oracle排名的时候,一开始我天真的认为,只要用rownum 去实现就可以了,然后我变这样写了

  SQL>  select a.*,rownum as "名字" from emp a;语句其运行效果如下:

EMPNO  ENAME  JOB  MGR  HIREDATE   SAL  COMM  DEPTNO 名次 

7369 

SMITH CLERK 7902 

1980/12/17 

800.00      20   1 

7499 

 ALLEN SAKESMAN  7698

1981/2/20 

1600.00      30  2

7521

WARD  SAKESMAN   7698 

1981/2/22 

1250.00     30  3 

7566 

JONES  MANAGER  7839 

1981/4/2 

2975.00     20  4 

7654

WARTIN  SAKESMAN   7698

1981/9/28 

1250.00      30   5 

7698

BLAKE  MANAGER  7839 

1981/5/1  

2850.00     30  6 

7782

CLARK  MANAGER   7839 

1981/6/9 

2450.00     10  7 

7788

SCOTT  ANALYST  7566 

1982/12/9 

3000.00     20  8 

7839

KING  PRESIDENT   

1981/11/17 

5000.00     10  9 

7844

 TURNER SALESMAN  7698  1981/9/8  1500.00     30  10 

7876

 ADAMS CLERK  7788  1983/1/12  1100.00     20  11 

7900 

JAMES  CLERK  7698  1981/12/3  950.00     30  12 

7902 

FORD  ANALYST  7566  1981/12/3  3000.00     20  13 

7934

MILIER CLERK 7782 1982/1/23 1300.00   10 14

结果怎好是我们想要的那种排名,我想这样应该一目了然了吧

  效果看起来蛮对昂,但是呢我们现在把语句改写成如下:

  SQL> select a.*,rownum as "名字" from emp a order by a.sal desc;

我天真的认为rownum 记录的数据应该和我想要的数据相吻合,但是结果如下:(毕竟rownum是用来分页的嘛)

EMPNO  ENAME  JOB  MGR  HIREDATE   SAL  COMM  DEPTNO 名次 

7839

KING CLERK 7902 

1980/12/17 

5000.00      10   9 

 7902 

FORD SAKESMAN  7698

1981/2/20 

3000.00      30  13

7788

SCOTT  SAKESMAN   7698 

1981/2/22 

3000.00     30  8 

7566 

JONES  MANAGER  7839 

1981/4/2 

2975.00     20  4 

7698

BLAKE  SAKESMAN   7698

1981/9/28 

2850.00      30   6 

7782

CLARK  MANAGER  7839 

1981/5/1  

2450.00     30  7 

7499

ALLEN  MANAGER   7839 

1981/6/9 

1600.00     10  2 

7844

TURNER  ANALYST  7566 

1982/12/9 

1500.00     20  10 

7934

MILIER PRESIDENT   

1981/11/17 

1300.00     10  14 

7521

 WARD SALESMAN  7698  1981/9/8  1250.00     30  3 

7654

 MARTIN CLERK  7788  1983/1/12  1250.00     20  5 

 7876 

ADAMS CLERK  7698  1981/12/3  1100.00     30  11 

 7900

JAMES ANALYST  7566  1981/12/3  950.00     20  12 

7396

SMITH CLERK 7782 1982/1/23 800.00    10 1

 完全就是哎(无语)

也许我们在开发中会去到这样或者那样的排序问题,如根据工资进行降序排列并且要求我们要两个并列的出现以后,其后的数据都要相应加1(好比两个第一下面再排就是第3没有第二)那我们要怎么去实现呢要想用上面的方法去实现是不可能了,要想用case去实现我想希望也不大,所以我们下面就介绍几种oracle的排名函数

1.dense_rank() 函数

SQL> select a.*,dense_rank() over(PARTITION BY deptno ORDER BY nvl(sal,0) DESC) as "名次" from emp a;

我们用dense_rank()函数和over()按照部门分组并按照工资降序进行排名 

EMPNO  ENAME  JOB  MGR  HIREDATE   SAL  COMM  DEPTNO 名次 

7839

KING CLERK 7902 

1980/12/17 

5000.00      10   1 

 7902 

FORD SAKESMAN  7698

1981/2/20 

2450.00      10  2

7788

SCOTT  SAKESMAN   7698 

1981/2/22 

1300.00     10 3

7566 

JONES  MANAGER  7839 

1981/4/2 

3000.00     20  1 

7698

BLAKE  SAKESMAN   7698

1981/9/28 

3000.00      20   1 

7782

CLARK  MANAGER  7839 

1981/5/1  

2975.00     20  2 

7499

ALLEN  MANAGER   7839 

1981/6/9 

1100.00     20  3 

7844

TURNER  ANALYST  7566 

1982/12/9 

800.00     20  4 

7934

MILIER PRESIDENT   

1981/11/17 

2850.00     30  1 

7521

 WARD SALESMAN  7698  1981/9/8  1600.00     30  2 

7654

 MARTIN CLERK  7788  1983/1/12  1500.00     30  3 

 7876 

ADAMS CLERK  7698  1981/12/3  1250.00     30  4 

 7900

JAMES ANALYST  7566  1981/12/3  1250.00     30 4

7396

SMITH CLERK 7782 1982/1/23 950.00    30 5
 结果就是每个部门之间进行了排名,并且实现了并列名次只是没有实现我们想要的结果

     假如我们把over()里的PARTITION BY deptno 去掉回事什么效果呢

     SQL> select a.*,dense_rank() over(ORDER BY nvl(sal,0) DESC) as "名次" from emp a; 

EMPNO  ENAME  JOB  MGR  HIREDATE   SAL  COMM  DEPTNO 名次 

7839

KING CLERK 7902 

1980/12/17 

5000.00      10   1 

 7902 

FORD SAKESMAN  7698

1981/2/20 

3000.00      20  2

7788

SCOTT  SAKESMAN   7698 

1981/2/22 

3000.00     20  2 

7566 

JONES  MANAGER  7839 

1981/4/2 

2975.00     20  3 

7698

BLAKE  SAKESMAN   7698

1981/9/28 

2850.00      30   4 

7782

CLARK  MANAGER  7839 

1981/5/1  

2450.00     10  5 

7499

ALLEN  MANAGER   7839 

1981/6/9 

1600.00     30  6 

7844

TURNER  ANALYST  7566 

1982/12/9 

1500.00     30  7 

7934

MILIER PRESIDENT   

1981/11/17 

1300.00     10  8 

7521

 WARD SALESMAN  7698  1981/9/8  1250.00     30  9 

7654

 MARTIN CLERK  7788  1983/1/12  1250.00     30  9 

 7876 

ADAMS CLERK  7698  1981/12/3  1100.00     20  10 

 7900

JAMES ANALYST  7566  1981/12/3  950.00     30  11 

7396

SMITH CLERK 7782 1982/1/23 800.00    20 12

 

结果就是整体进行了排名,并且实现了并列名次只是没有实现我们想要的结果(而且工资也不是按部门降序了)

2.ROW_NUMBER() 函数

  SQL> select a.*,ROW_NUMBER() over(ORDER BY nvl(sal,0) DESC) as "名次" from emp a;

 

 

EMPNO  ENAME  JOB  MGR  HIREDATE   SAL  COMM  DEPTNO 名次 

7839

KING CLERK 7902 

1980/12/17 

5000.00      10   1 

 7902 

FORD SAKESMAN  7698

1981/2/20 

3000.00      20  2

7788

SCOTT  SAKESMAN   7698 

1981/2/22 

3000.00     20  3 

7566 

JONES  MANAGER  7839 

1981/4/2 

2975.00     20  4 

7698

BLAKE  SAKESMAN   7698

1981/9/28 

2850.00      30   5 

7782

CLARK  MANAGER  7839 

1981/5/1  

2450.00     10  6 

7499

ALLEN  MANAGER   7839 

1981/6/9 

1600.00     30  7 

7844

TURNER  ANALYST  7566 

1982/12/9 

1500.00     30  8 

7934

MILIER PRESIDENT   

1981/11/17 

1300.00     10  9 

7521

 WARD SALESMAN  7698  1981/9/8  1250.00     30  10 

7654

 MARTIN CLERK  7788  1983/1/12  1250.00     30  11 

 7876 

ADAMS CLERK  7698  1981/12/3  1100.00     20  12 

 7900

JAMES ANALYST  7566  1981/12/3  950.00     30  13 

7396

SMITH CLERK 7782 1982/1/23 800.00    20 14

 

 

 结果显示这个函数为我们进行了我们惯性思维认可的排名,但是我们怎样才能够实现上面做说的那种并列排名(好比两个第一下面再排就是第3没有第二);看下面这个函数

3.RANK ()

结果怎好是我们想要的那种排名,我想这样应该一目了然了吧(由于字数限制正解只要把函数换为rank()即可

1
1
分享到:
评论

相关推荐

    Oracle开发专题之:分析函数

    在这些系统之外,还有一种称之为OLAP的系统(即Online Aanalyse Process),这些系统一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系在一起。这些系统的特点是数据量大,对实时响应的要求不高...

    常见主流数据库的详细信息

    大型数据库有:Oracle、Sybase、DB2、SQL server 小型数据库有:Access、MySQL、BD2等。 2007年4月29日消息,国外媒体报道,据权威调研机构IDC初步数据显示,尽管微软SQL Server发展迅猛,但甲骨文依然称霸全球...

    常用数据库管理系统简介.docx

    常用数据库管理系统简介 目前市场上比较流行的数据库管理系统产品主要是 Oracle、旧M、Microsoft和Sybase、 mysql等公司的产品,下面对常用的几种系统做简要的介绍: Oracle Oracle数据库被认为是业界目前比较成功的...

    基于Vue+SpringBoot+MySQL的海南旅游推荐系统.zip

    基于协同推荐算法,包括用户网页和管理后台,包含景点类型模块、旅游景点模块、行程推荐模块、美食推荐模块、景点排名模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件...

    经典全面的SQL语句大全

    这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"  注意:以上...

    java开源包1

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包11

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包2

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包3

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包6

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包5

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包10

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包4

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包8

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包7

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包9

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包101

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    Java资源包01

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    JAVA上百实例源码以及开源项目

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    JAVA上百实例源码以及开源项目源代码

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

Global site tag (gtag.js) - Google Analytics