`
Longmanfei
  • 浏览: 48075 次
  • 性别: 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高级查询..各种各样的查法..重基础到深入

    例如,计算每个学生的总成绩排名: ```sql SELECT s.SNO, SUM(s.DEGREE) OVER (PARTITION BY s.SNO) AS TOTAL_DEGREE, RANK() OVER (PARTITION BY s.CLASS ORDER BY SUM(s.DEGREE) DESC) AS RANK FROM SCOTT.SCORE...

    ORACLE技巧 - 不同记录集的横向合并

    在Oracle数据库中,对于两个记录集的比较,通常会涉及到以下几种方法: 1. **编程存储过程返回游标**:这种方式允许开发者在存储过程中对两批数据进行逐一比对,并将结果返回给调用者。这种方式灵活性高,但开发...

    Oracle查询优化改写 技巧与案例.pdf

    分析函数和窗口函数在进行数据汇总、排名等操作时非常有用,同时它们也可以在不改变原有数据表的情况下,通过一种临时的方式进行复杂的数据处理。 6. 重写复杂的IN语句。对于使用IN语句的查询,特别是当IN子句中...

    深入浅出Oracle分析函数

    窗口可以基于行的顺序、分区或者组合这两种方式,灵活地控制分析函数的计算范围。 七、实战应用 通过实际案例,如销售数据分析、员工绩效评估等,展示如何利用分析函数解决实际问题,提升数据处理能力。 通过阅读...

    Oracle学习笔记

    - 外连接是指在连接两个表时保留未匹配行的一种连接方式。 - 示例:为了展示所有部门以及所属该部门的员工,即使某些部门没有员工也会显示出来。 - `LEFT JOIN` 和 `RIGHT JOIN` 是两种常用的外连接类型,而 `...

    oracle常用经典sql查询.rar

    在Oracle SQL查询中,有几种常见的高级查询技术值得深入研究。例如,联接(JOIN)操作允许你合并来自多个表的数据,以获取更全面的信息。内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接...

    Oracle_adv.zip_Oracle進階_oracle

    正则表达式在Oracle 10g中提供了强大的文本匹配功能,它允许我们以一种简洁的方式进行复杂的字符串匹配和操作。以下是一些关键的正则表达式概念: 1. **元字符**:例如`^`(行首)、`$`(行尾)、`.`(任意单个字符...

    三思笔记之oracle函数

    本文将深入探讨Oracle中的几种重要函数,包括单值函数和分析函数,这些都是DBA(数据库管理员)日常工作中不可或缺的知识点。 首先,让我们关注“单值函数”。这些函数接受一个或多个输入参数,并返回一个单一的值...

    oracle开窗函数学习技巧总结

    在Oracle数据库中,开窗函数是一种非常强大的功能,它能够帮助我们对数据进行更复杂的分析和处理。开窗函数允许我们在查询结果集的一个窗口内执行聚合操作,而无需对数据进行物理排序或分组。本文将重点介绍`OVER`...

    Oracle 的查询优化

    在本文中,我们将深入探讨 Oracle 中的查询优化技术,包括表的各种连接方式、子查询优化、窗口函数的应用、视图消除、并行执行技术等。 一、Oracle 中的查询优化技术 Oracle 中的查询优化技术可以分为以下几类: ...

    ORACLE_分析函数大全

    Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...

    oracle分析函数参考手册

    Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且能够返回多个结果行。这与传统的聚合函数(如`SUM`、`COUNT`等)形成鲜明对比,后者通常只针对每一组返回单一的结果行。自Oracle 8.1.6...

    oracle 基础知识总结初学者必备

    窗口函数是Oracle SQL中非常强大的功能之一,可以轻松地计算排名、累计总和等复杂查询。常见的窗口函数包括`ROW_NUMBER()`、`RANK()`和`DENSE_RANK()`等。 - **ROW_NUMBER()**:为每一行分配一个唯一的编号。可以...

    oracle行转列较精典的解决方案

    本文将详细介绍几种在Oracle数据库中实现行转列的经典方法,并通过具体示例来展示这些方法的应用。 #### 一、使用SQL decode函数进行行转列 ##### 1. 实现思路 通过使用`decode`函数结合`sum`聚合函数可以实现行...

    oracle分析函数及开窗函数

    开窗函数的`OVER`子句可以包含以下几种类型: 1. **PARTITION BY**:将数据集分割成多个分区,在每个分区上分别进行计算。 2. **ORDER BY**:指定窗口内行的顺序。 3. **ROWS BETWEEN** / **RANGE BETWEEN**:指定...

    Java+Oracle学生信息管理系统

    在本系统中,Java主要承担以下几个角色: 1. **MVC架构**:系统采用Model-View-Controller(MVC)设计模式,将业务逻辑、数据处理和用户界面分离,提高代码复用性和模块化。 2. **Servlet与JSP**:Servlet用于处理...

    Oracle经验集锦

    在导入数据到Oracle数据库时,需要注意几个方面: - **数据结构一致性**:确保导入的数据结构与现有数据库结构相匹配。 - **使用IMP命令**:在导入数据时,可以指定一些参数以优化导入过程,如: - `ROWS=N` 表示只...

    oracle统计函数.pdf

    本文档主要介绍了Oracle数据库中的几种统计函数,包括row_number(), rank()和dense_rank(),以及它们的使用方法和应用场景。 1. row_number()函数:这是一个窗口函数,用于为每行生成一个唯一的序号。其基本语法为...

    Oracle10gR2分析函数(中英对照版).pdf

    从给定的文件信息来看,主要讨论的是Oracle 10g R2中的分析函数,这是一种在数据库查询中处理复杂数据汇总需求的高级功能。分析函数允许用户基于一组数据执行复杂的计算,而不仅仅是简单的聚合(如SUM,AVG等),...

Global site tag (gtag.js) - Google Analytics