Oracle 分析函数 ROW_NUMBER() 使用

1、row_number() over()排序功能:

(1) row_number() over()分组排序功能:

在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by  order by 的执行。

partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

例如:emp,根据部门分组排序。

SQL> select empno,deptno,sal ,row_number() over (partition by deptno order by sal desc) rank from emp;

   EMPNO     DEPTNO     SAL       RANK
---------- ---------- ---------- ----------
      7839   10    5000  1
      7782   10    2450  2
      7934   10    1300  3
      7788   20    3000  1
      7902   20    3000  2
      7566   20    2975  3
      7876   20    1100  4
      7369   20     800  5
      7698   30    2850  1
      7499   30    1600  2
      7844   30    1500  3
      7654   30    1250  4
      7521   30    1250  5
      7900   30     950  6
14 rows selected.

(2)对查询结果进行排序:(无分组)

SQL> select empno,deptno,sal ,row_number() over (order by sal desc) rank from emp;

 EMPNO     DEPTNO     SAL       RANK
---------- ---------- ---------- ----------
      7839   10    5000  1
      7902   20    3000  2
      7788   20    3000  3
      7566   20    2975  4
      7698   30    2850  5
      7782   10    2450  6
      7499   30    1600  7
      7844   30    1500  8
      7934   10    1300  9
      7521   30    1250 10
      7654   30    1250 11
      7876   20    1100 12
      7900   30     950 13
      7369   20     800 14
14 rows selected.

row_number() over()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

2、rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

SQL> select empno,deptno,sal ,rank() over (partition by deptno order by sal desc) rank from emp;

 EMPNO     DEPTNO     SAL       RANK
---------- ---------- ---------- ----------
      7839   10    5000  1
      7782   10    2450  2
      7934   10    1300  3
      7788   20    3000  1
      7902   20    3000  1              
      7566   20    2975  3          --跳跃了
      7876   20    1100  4
      7369   20     800  5
      7698   30    2850  1
      7499   30    1600  2
      7844   30    1500  3
      7654   30    1250  4
      7521   30    1250  4
      7900   30     950  6
14 rows selected.

SQL> select empno,deptno,sal ,rank() over (order by sal desc) rank from emp;

 EMPNO     DEPTNO     SAL       RANK
---------- ---------- ---------- ----------
      7839   10    5000  1
      7902   20    3000  2
      7788   20    3000  2   
      7566   20    2975  4        --跳跃了
      7698   30    2850  5
      7782   10    2450  6
      7499   30    1600  7
      7844   30    1500  8
      7934   10    1300  9
      7521   30    1250 10
      7654   30    1250 10
      7876   20    1100 12
      7900   30     950 13
      7369   20     800 14
14 rows selected.

3、dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .

SQL> select empno,deptno,sal ,dense_rank() over (order by sal desc) rank from emp;

   EMPNO     DEPTNO     SAL       RANK
---------- ---------- ---------- ----------
      7839   10    5000  1
      7902   20    3000  2
      7788   20    3000  2
      7566   20    2975  3
      7698   30    2850  4
      7782   10    2450  5
      7499   30    1600  6
      7844   30    1500  7
      7934   10    1300  8
      7521   30    1250  9
      7654   30    1250  9
      7876   20    1100 10
      7900   30     950 11
      7369   20     800 12
14 rows selected.

SQL> select empno,deptno,sal ,dense_rank() over (partition by deptno order by sal desc) rank from emp;

EMPNO     DEPTNO     SAL       RANK
---------- ---------- ---------- ----------
      7839   10    5000  1
      7782   10    2450  2
      7934   10    1300  3
      7788   20    3000  1
      7902   20    3000  1
      7566   20    2975  2    --不跳跃
      7876   20    1100  3
      7369   20     800  4
      7698   30    2850  1
      7499   30    1600  2
      7844   30    1500  3
      7654   30    1250  4
      7521   30    1250  4
      7900   30     950  5
14 rows selected.

使用ROW_NUMBER删除重复数据

---假设表TAB中有a,b,c三列,可以使用下列语句删除a,b,c都相同的重复行。

DELETE FROM (select year,QUARTER,RESULTS,row_number() over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS) AS ROW_NO FROM SALE )

WHERE ROW_NO>1

参考:https://www.cnblogs.com/alsf/p/6344197.html

原文地址:http://blog.51cto.com/395469372/2072381

时间: 2024-08-30 16:42:26

Oracle 分析函数 ROW_NUMBER() 使用的相关文章

Oracle分析函数row_number()等的使用实例

--分析函数 --rank() over(order by) --值相同,排名相同,序号跳跃 select * from t_account select rank() over(order by usenum desc) 排名,t.* from t_account t --值相同,排名相同,序号连续 select dense_rank() over(order by usenum desc) 排名,t.* from t_account t --序号连续,不管值是否相同 select row_n

Oracle 分析函数

Oracle分析函数 --row_number():连续不重复 1234567 --rank():跳跃可重复 12333678 --dense_rank():连续可重复 12333456 row_number() over(partition by deptno order by sal desc) over( partition by [分区字段,可以有多个] order by [一个或多个字段]) 笔试题题目如下: 题目如下: 请用一条sql语句查询出scott.emp表中每个部门工资前三位

oracle分析函数技术详解(配上开窗函数over())

一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处是什么?普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值. 分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(or

[转]oracle分析函数Rank, Dense_rank, row_number

oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 =============================================== 1.使用rownum为记录排名 2.使用分析函数来为记录排名 3.使用分析函数为记录进行分组排名 一.使用rownum为记录排名: 在前面一篇<Oracle开发专题之:分析函数>,我们认识了分析函数的基本应用,现在我们再来考虑下面几个问题:

ORACLE分析函数(1)

1. oracle中日期转换为yyyy年mm月dd日的形式 select to_char(sysdate,'"年"mm"月"dd"日"') from dual; 2. oracle分析函数语法 2.1 ORDER BY select e.last_name, e.manager_id, e.salary, avg(e.salary) over() as emp_count --等同于(select avg(*) from employees) f

Oracle分析函数学习总结

在公司经常会用到oracle分析函数,在统计这块用处很大,特别是复杂的sql查询,我就在这边结合网络一些资料进行了总结,希望可以帮助到大家: Oracle分析函数--函数列表 SUM         :该函数计算组中表达式的累积和 MIN         :在一个组中的数据窗口中查找表达式的最小值 MAX         :在一个组中的数据窗口中查找表达式的最大值 AVG          :用于计算一个组和数据窗口内表达式的平均值. COUNT       :对一组内发生的事情进行累积计数 -

Oracle分析函数Over()

一.Over()分析函数 说明:聚合函数(如sum().max()等)可以计算基于组的某种聚合值,但是聚合函数对于某个组只能返回一行记录.若想对于某组返回多行记录,则需要使用分析函数. 1.rank()/dense_rank over(partition by ... order by ...) 说明:over()在什么条件之上; partition by 按哪个字段划分组: order by 按哪个字段排序: 注意: (1)使用rank()/dense_rank() 时,必须要带order b

oracle分析函数 (转)

一.总体介绍 12.1 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC DESC> <NULLS FIRST NULLS LAST>> <WINDOWING子句>) PARTITION子句 ORDER BY子句 WINDOWING子句 缺省时相当于RANGE UNBOUNDED PRECEDING 1. 值域窗(RANGE

Oracle分析函数(一)

一.总体介绍 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC DESC> <NULLS FIRST NULLS LAST>> <WINDOWING子句>) PARTITION子句 ORDER BY子句 WINDOWING子句 缺省时相当于RANGE UNBOUNDED PRECEDING 1. 值域窗(RANGE WINDO