在写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()即可)
分享到:
相关推荐
例如,计算每个学生的总成绩排名: ```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数据库中,对于两个记录集的比较,通常会涉及到以下几种方法: 1. **编程存储过程返回游标**:这种方式允许开发者在存储过程中对两批数据进行逐一比对,并将结果返回给调用者。这种方式灵活性高,但开发...
分析函数和窗口函数在进行数据汇总、排名等操作时非常有用,同时它们也可以在不改变原有数据表的情况下,通过一种临时的方式进行复杂的数据处理。 6. 重写复杂的IN语句。对于使用IN语句的查询,特别是当IN子句中...
窗口可以基于行的顺序、分区或者组合这两种方式,灵活地控制分析函数的计算范围。 七、实战应用 通过实际案例,如销售数据分析、员工绩效评估等,展示如何利用分析函数解决实际问题,提升数据处理能力。 通过阅读...
- 外连接是指在连接两个表时保留未匹配行的一种连接方式。 - 示例:为了展示所有部门以及所属该部门的员工,即使某些部门没有员工也会显示出来。 - `LEFT JOIN` 和 `RIGHT JOIN` 是两种常用的外连接类型,而 `...
在Oracle SQL查询中,有几种常见的高级查询技术值得深入研究。例如,联接(JOIN)操作允许你合并来自多个表的数据,以获取更全面的信息。内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接...
正则表达式在Oracle 10g中提供了强大的文本匹配功能,它允许我们以一种简洁的方式进行复杂的字符串匹配和操作。以下是一些关键的正则表达式概念: 1. **元字符**:例如`^`(行首)、`$`(行尾)、`.`(任意单个字符...
本文将深入探讨Oracle中的几种重要函数,包括单值函数和分析函数,这些都是DBA(数据库管理员)日常工作中不可或缺的知识点。 首先,让我们关注“单值函数”。这些函数接受一个或多个输入参数,并返回一个单一的值...
在Oracle数据库中,开窗函数是一种非常强大的功能,它能够帮助我们对数据进行更复杂的分析和处理。开窗函数允许我们在查询结果集的一个窗口内执行聚合操作,而无需对数据进行物理排序或分组。本文将重点介绍`OVER`...
在本文中,我们将深入探讨 Oracle 中的查询优化技术,包括表的各种连接方式、子查询优化、窗口函数的应用、视图消除、并行执行技术等。 一、Oracle 中的查询优化技术 Oracle 中的查询优化技术可以分为以下几类: ...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...
Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且能够返回多个结果行。这与传统的聚合函数(如`SUM`、`COUNT`等)形成鲜明对比,后者通常只针对每一组返回单一的结果行。自Oracle 8.1.6...
窗口函数是Oracle SQL中非常强大的功能之一,可以轻松地计算排名、累计总和等复杂查询。常见的窗口函数包括`ROW_NUMBER()`、`RANK()`和`DENSE_RANK()`等。 - **ROW_NUMBER()**:为每一行分配一个唯一的编号。可以...
本文将详细介绍几种在Oracle数据库中实现行转列的经典方法,并通过具体示例来展示这些方法的应用。 #### 一、使用SQL decode函数进行行转列 ##### 1. 实现思路 通过使用`decode`函数结合`sum`聚合函数可以实现行...
开窗函数的`OVER`子句可以包含以下几种类型: 1. **PARTITION BY**:将数据集分割成多个分区,在每个分区上分别进行计算。 2. **ORDER BY**:指定窗口内行的顺序。 3. **ROWS BETWEEN** / **RANGE BETWEEN**:指定...
在本系统中,Java主要承担以下几个角色: 1. **MVC架构**:系统采用Model-View-Controller(MVC)设计模式,将业务逻辑、数据处理和用户界面分离,提高代码复用性和模块化。 2. **Servlet与JSP**:Servlet用于处理...
在导入数据到Oracle数据库时,需要注意几个方面: - **数据结构一致性**:确保导入的数据结构与现有数据库结构相匹配。 - **使用IMP命令**:在导入数据时,可以指定一些参数以优化导入过程,如: - `ROWS=N` 表示只...
本文档主要介绍了Oracle数据库中的几种统计函数,包括row_number(), rank()和dense_rank(),以及它们的使用方法和应用场景。 1. row_number()函数:这是一个窗口函数,用于为每行生成一个唯一的序号。其基本语法为...
从给定的文件信息来看,主要讨论的是Oracle 10g R2中的分析函数,这是一种在数据库查询中处理复杂数据汇总需求的高级功能。分析函数允许用户基于一组数据执行复杂的计算,而不仅仅是简单的聚合(如SUM,AVG等),...