`

[Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()

阅读更多

转:本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/huanghui22/archive/2007/05/03/1595166.aspx


有些时候我们希望得到指定数据中的前n列,示例如下:

得到每个部门薪水最高的三个雇员:

先创建示例表

create table emp
as
select * from scott.emp;

alter table emp
add constraint emp_pk
primary key(empno);

create table dept
as
select * from scott.dept;

alter table dept
add constraint dept_pk
primary key(deptno);

先看一下row_number() /rank()/dense_rank()三个函数之间的区别

 select emp.deptno,emp.sal,emp.empno,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
  rank() over (partition by deptno order by sal desc) rank, --1,1,3
  dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
结果如下:

10    5000.00    7839    1    1    1
10    2450.00    7782    2    2    2
10    1300.00    7934    3    3    3
20    3000.00    7788    1    1    1
20    3000.00    7902    2    1    1
20    2975.00    7566    3    3    2
20    1100.00    7876    4    4    3
20    800.00    7369    5    5    4
30    2850.00    7698    1    1    1
30    1600.00    7499    2    2    2
取每个部门的薪水前三位雇员:

select t.deptno,t.rank,t.sal from
 (
 select emp.*,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
  rank() over (partition by deptno order by sal desc) rank, --1,1,3
  dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
 ) t
where t.rank<=3
结果如下:

10    1    5000.00
10    2    2450.00
10    3    1300.00
20    1    3000.00
20    1    3000.00
20    3    2975.00
30    1    2850.00
30    2    1600.00
30    3    1500.00
如果想输出成deptno  sal1   sal2   sal3这种类型的格式
步骤一(decode):

select t.deptno,decode(row_number,1,sal) sal1,decode(row_number,2,sal) sal2,decode(row_number,3,sal) sal3 from
 (
 select emp.*,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
  rank() over (partition by deptno order by sal desc) rank, --1,1,3
  dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
 ) t
where t.rank<=3

结果如下:

10    5000       
10                  2450   
10                             1300
20    3000       
20                  3000   
20                              2975
30    2850       
30                 1600   
30                             1500
步骤二(使用聚合函数去除null,得到最终结果):

select t.deptno,max(decode(row_number,1,sal)) sal1,max(decode(row_number,2,sal)) sal2,max(decode(row_number,3,sal)) sal3 from
 (
 select emp.*,row_number() over (partition by deptno order by sal desc) row_number,  --1,2,3
  rank() over (partition by deptno order by sal desc) rank, --1,1,3
  dense_rank() over (partition by deptno order by sal desc) dense_rank from emp --1,1,2
 ) t
where t.rank<=3
group by t.deptno
结果如下:

10    5000    2450    1300
20    3000    3000    2975
30    2850    1600    1500

 

分享到:
评论

相关推荐

    深入探讨:oracle中row_number() over()分析函数用法

    Oracle数据库中的`row_number() over()`分析函数是一个非常实用的工具,用于为数据集中的每一行分配一个唯一的整数,这个数字基于指定的排序条件。在处理大数据集时,它可以帮助我们进行分页、排名或者在复杂的查询...

    Oracle内建函数大全

    以上只是Oracle内建函数的一部分,实际中还有许多其他函数,如位运算函数、分析函数、游标函数等,它们极大地增强了SQL语言的功能,使得Oracle数据库能够处理各种复杂的数据操作。Oracle Built-in Functions.chm文件...

    oracle sql分页语句

    在Oracle数据库系统中,实现分页查询通常使用ROWNUM伪列或者结合RANK()、DENSE_RANK()、ROW_NUMBER()等窗口函数。这里我们将详细探讨这些方法及其应用场景。 首先,ROWNUM是一个特殊的伪列,它在查询执行时为每一行...

    Oracle 分析函数.doc

    Oracle 分析函数是数据库查询中的强大工具,它们允许在单个SQL语句中对结果集进行复杂的计算和分组操作,极大地简化了数据分析的过程。在Oracle 8i版本之后引入,分析函数为处理大量数据提供了高效的方法,避免了...

    oracle 10G函数大全

    - RANK/DENSE_RANK/ROW_NUMBER:在分组后为每一行分配唯一的排名。 - LEAD/LAG:在结果集中向前/向后查看行的数据。 这份“Oracle 10G函数大全”CHM文件很可能是按照这些分类详细介绍了每个函数的用法、示例和...

    oracle分析函数

    ### Oracle分析函数详解:row_number() over 在Oracle数据库中,分析函数(Analytic Functions)是一种强大而灵活的数据处理工具,它们能够在查询结果集中对每一行数据进行计算,而不像传统的聚合函数那样只返回...

    SQL-grammer-collection.zip_sql语句collection

    1. **窗口函数(Window Function)**: ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), NTILE()等,为数据分析提供强大的工具。 2. **集合操作(UNION, INTERSECT, EXCEPT)**: 合并、找出共同值或差异值。 3...

    Oracle经典SQL语句

    11. **窗口函数**:如ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD()等,提供了在数据行之间进行计算的能力,特别适用于排名、移动平均等分析。 12. **分区表**:在大型数据库中,通过分区可以提高查询性能,...

    转帖--oracle分析函数+PLSQL小结

    PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库内置的面向过程的编程语言,它结合了SQL语句和过程式编程语言的特点,用于编写存储过程、函数、触发器和游标等数据库对象,以实现更复杂的...

    oracle-plsql.zip_oracle_pl sql 分组查询_plsql_plsql 分组查询

    5. **高级查询**:包括使用集合操作(UNION、INTERSECT、EXCEPT)和窗口函数(ROW_NUMBER、RANK、DENSE_RANK等),这些功能使查询更复杂和灵活。 6. **数据字典**:Oracle的数据字典是系统维护的一系列表和视图,...

    Oracle分析函数实践 - blog.docx

    Oracle分析函数是数据库查询中非常强大的工具,它们用于处理复杂的报表和统计需求,特别是在在线分析处理(OLAP)环境中。分析函数与聚合函数的...在编写SQL时,合理运用分析函数,能够显著提升SQL语句的质量和性能。

    Oracle内置SQL函数-分类整理大全

    RANK、DENSE_RANK和ROW_NUMBER可以为每行分配一个唯一的排名,ORDER BY用于排序结果集,而GROUP BY和ROLLUP用于生成汇总数据。 九、游标和集合函数 游标允许程序逐行处理查询结果,而集合函数如BULK COLLECT和INTO...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    Oracle数据库提供了多种方法来实现分页查询,其中包括使用ROWNUM伪列、游标(CURSOR)以及Oracle的高级分页功能如ROW_NUMBER()、RANK()和DENSE_RANK()等。 1. ROWNUM伪列: ROWNUM是Oracle数据库特有的一个伪列,它...

    SQL 语句大全 SQL 语句大全

    - **ROW_NUMBER()、RANK()和DENSE_RANK()**:生成行号以进行排名或分组操作。 - **LEAD()和LAG()**:向前或向后查看相邻行的数据。 - **FIRST_VALUE()、LAST_VALUE()和NTH_VALUE()**:获取特定位置的值。 10. **...

    ORACLE_分析函数大全

    除了这些,Oracle分析函数还包括RANK、DENSE_RANK、ROW_NUMBER等排名函数,LEAD和LAG用于获取当前行之前或之后的值,FIRST_VALUE和LAST_VALUE则返回窗口内的第一个或最后一个值,以及NTILE用于将数据分桶等。...

    数据库真分页SQL语句

    - **使用RANK()和DENSE_RANK()函数**:这两个函数与ROW_NUMBER()类似,但处理重复值的方式不同,适合某些特定场景。 - **使用存储过程**:在数据库中创建存储过程,可以封装复杂的分页逻辑,包括计算总页数、确定...

    Oracle 分析函数的使用.doc

    总之,Oracle的分析函数为复杂数据分析提供了强大而灵活的手段,使我们能够以简洁的SQL语句完成复杂的统计计算,极大地提升了数据处理的效率和便捷性。掌握并熟练运用这些函数,对于任何Oracle数据库管理员或开发...

    Oracle_SQL_Reference

    - **窗口函数**:如ROW_NUMBER、RANK、DENSE_RANK等,用于处理分组或排序的数据。 - **条件表达式**:如CASE WHEN THEN ELSE END,用于根据条件返回不同的结果。 #### 四、Oracle SQL 特色功能 - **PL/SQL**:一种...

    oracle分析函数over_及开窗函数.txt

    本文将详细介绍Oracle中的`OVER`子句以及几种常用的开窗函数,包括`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`和`LAG()`等。 #### 二、基本概念 - **`OVER`子句**:`OVER`子句用于指定分析函数的作用范围,它可以...

Global site tag (gtag.js) - Google Analytics