ROW_NUMBER() OVER()

ROW_NUMBER()OVER() 是Oracle SQL分析函数,主要是用来对要查询的数据分组排序使用。 
使用方法 
ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col2) 
对列col1分组,col2排序操作。 
例子:

SQL> SELECT 
  2   ROW_NUMBER()OVER(PARTITION BY deptno ORDER BY sal, empno) AS rn,
  3   empno, ename, sal, deptno
  4  FROM emp;

    RN  EMPNO ENAME     SAL DEPTNO---------- ---------- ---------- ---------- ----------
     1   7934 MILLER           1300     10
     2   7782 CLARK        2450     10
     3   7839 KING         5000     10
     1   7369 SMITH     800     20
     2   7876 ADAMS        1100     20
     3   7566 JONES        2975     20
     4   7788 SCOTT        3000     20
     5   7902 FORD         3000     20
     1   7900 JAMES     950     30
     2   7521 WARD         1250     30
     3   7654 MARTIN           1250     30

    RN  EMPNO ENAME     SAL DEPTNO---------- ---------- ---------- ---------- ----------
     4   7844 TURNER           1500     30
     5   7499 ALLEN        1600     30
     6   7698 BLAKE        2850     3014 rows selected.

同时也可以单独使用其来对结果进行排序 
可以和order by 对比一下:

SQL> SELECT empno, ename, sal,
  2    ROW_NUMBER()OVER(ORDER BY sal, empno) AS rn
  3  FROM emp;

     EMPNO ENAME	     SAL	 RN
---------- ---------- ---------- ----------
      7369 SMITH	     800	  1
      7900 JAMES	     950	  2
      7876 ADAMS	    1100	  3
      7521 WARD 	    1250	  4
      7654 MARTIN	    1250	  5
      7934 MILLER	    1300	  6
      7844 TURNER	    1500	  7
      7499 ALLEN	    1600	  8
      7782 CLARK	    2450	  9
      7698 BLAKE	    2850	 10
      7566 JONES	    2975	 11

     EMPNO ENAME	     SAL	 RN
---------- ---------- ---------- ----------
      7788 SCOTT	    3000	 12
      7902 FORD 	    3000	 13
      7839 KING 	    5000	 14

14 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 3145491563

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |    14 |   462 |	4  (25)| 00:00:01 |
|   1 |  WINDOW SORT	   |	  |    14 |   462 |	4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   462 |	3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics
----------------------------------------------------------
	  5  recursive calls
	  0  db block gets
	 16  consistent gets
	  1  physical reads
	  0  redo size
       1049  bytes sent via SQL*Net to client
	523  bytes received via SQL*Net from client
	  2  SQL*Net roundtrips to/from client
	  1  sorts (memory)
	  0  sorts (disk)
	 14  rows processed

SQL> SELECT empno, ename, sal
  2  FROM emp
  3  ORDER BY sal, empno;

     EMPNO ENAME	     SAL
---------- ---------- ----------
      7369 SMITH	     800
      7900 JAMES	     950
      7876 ADAMS	    1100
      7521 WARD 	    1250
      7654 MARTIN	    1250
      7934 MILLER	    1300
      7844 TURNER	    1500
      7499 ALLEN	    1600
      7782 CLARK	    2450
      7698 BLAKE	    2850
      7566 JONES	    2975

     EMPNO ENAME	     SAL
---------- ---------- ----------
      7788 SCOTT	    3000
      7902 FORD 	    3000
      7839 KING 	    5000

14 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 150391907

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |    14 |   462 |	4  (25)| 00:00:01 |
|   1 |  SORT ORDER BY	   |	  |    14 |   462 |	4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   462 |	3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics
----------------------------------------------------------
	  4  recursive calls
	  0  db block gets
	 16  consistent gets
	  1  physical reads
	  0  redo size
	943  bytes sent via SQL*Net to client
	523  bytes received via SQL*Net from client
	  2  SQL*Net roundtrips to/from client
	  1  sorts (memory)
	  0  sorts (disk)
	 14  rows processed

对比ORDER BY 子句,排序结果一样,使用ROW_NUMBER()OVER()函数可生产RN列,便于在某些列表程序选择行数。

时间: 2024-08-20 14:54:24

ROW_NUMBER() OVER()的相关文章

SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容

USE tempdb GO -------------------------------------------------------------------------- IF OBJECT_ID('Student','U') IS NOT NULL DROP TABLE Student GO CREATE TABLE Student ( StuID NVARCHAR(8) PRIMARY KEY, Name NVARCHAR(5) ) GO INSERT INTO Student(Stu

LINQ to SQL 模拟实现 ROW_NUMBER() OVER(ORDER BY ...) 的功能

?  前言 本来是想使用 LINQ 实现类似 SQL: ROW_NUMBER() OVER(ORDER BY -) 的功能,但是貌似 LINQ 不支持,反正没找到解决办法,无奈使用了LINQ Select() 方法实现. 1)   需求,需要实现一下 SQL: SELECT TOP 10 ROW_NUMBER() OVER(ORDER BY T.TotalAmount DESC) AS SN, * FROM ( SELECT T2.Name, SUM(T2.Amount) AS TotalAmo

sql 两种分页offset和row_number简单分析

新建临时表字段id,向临时表里插入1,2,3,4,5,6 if object_id('tempdb..#test') is not null drop table #test create table #test(id int)insert into #test(id)values(1),(2),(3),(4),(5),(6) declare @page int---当前页面declare @rows int---页面大小set @page=2set @rows=3 ---------当前页面为

用oracle中的Row_Number实现分页

Row_Number实现分页 1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2:再查询该集合的 第 1  到第 5条数据 select * from     (select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1) as temp    where rowNumber betwee

oracle数据库中 rownum 和row_number()的区别和练习

明确对于rownum 来说 它是oracle 系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是二,以此类推,这个为字段可以用于限制查询的返回的总行数,因为rownum总是从1开始,但是1以上的自然数在rownum 做等于判断时都认为是false 条件,所以无法查到 rownum=n (n>1的自然数),所以查找第二行以后的记录可以用子查询方法来解决,给子查询中的rownum取别名;对于小于某个值的情况两种方法都差不多,但是对于某个不等于一的值或者求某个值到某个值之间的情况,用

SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较

排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一下这四个排名函数的功能及用法.在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示: 图1 其中field1字段的类型是int,field2字段的类型是varchar 一.row_number row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号

MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能

网上看见了好多例子都基本上是一样的,没有过多的解释,对于一个初学MySQL来说有点难,我把部分转摘过来如下 原文:http://www.cnblogs.com/buro79xxd/archive/2012/08/29/2662489.html 要求目标:1.确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次. 创建表格:2.来创建实例数据: drop table if exists heyf_t10; create table heyf_t10 (empid int ,deptid i

T-SQL——ROW_NUMBER

语法: ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 解释: row_number()表示1开始,为每一条记录添加这条记录在多少行的序号. OVER (PARTITION BY COLUMN ORDER BY COLUMN) 执行的表,按照表内某个字段进行顺序排列. 示例1: select ID,ROW_NUMBER() over(order by partynum)as rows,partynum from V_XINPartyI

SQL Server数据库ROW_NUMBER()函数使用

下面以几个实例来说明ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer 原理:先按psd进行排序,排序完后,给每条数据进行编号. 2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下: select DID,customerID,totalPrice,ROW_NUMBER() 

row_number() over(...)函数

row_number() over(...)简直就是个吊炸天的函数. 之前用group by分组时select的字段除了group by字段外,其他字段都要用聚合函数包起来(如果有的话),如count(1),sum(amount),max(created_date),这样对其他非分组字段的处理只能满足一些常规的需求,如分组查询created_date最大的那条记录 以平安寿险红包项目举例 需求一:查询投保表中每个子红包最近一次的投保失败记录 需求二:查询投保表中每个子红包最近两次的投保失败记录