Oracle中的 row_number() over (partition by order by ) 用法

oracle 里面经常这样用

select col1,col2..., row_number() over (partition by colx order by coly) from table_name;;

这句话的意思是把表中的数值按照colx 分组,每一组内部按照coly排序,同时 row_number()返回排序之后该记录在改组内部的序号。

比如我们知道有emp表如下:

SQL> SELECT * FROM SCOTT.EMP;

     EMPNO ENAME                          JOB                                MGR HIREDATE                  SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------ ---------- ---------- ----------
      7369 SMITH                          CLERK                             7902 17-DEC-80                 800                    20
      7499 ALLEN                          SALESMAN                          7698 20-FEB-81                1600        300         30
      7521 WARD                           SALESMAN                          7698 22-FEB-81                1250        500         30
      7566 JONES                          MANAGER                           7839 02-APR-81                2975                    20
      7654 MARTIN                         SALESMAN                          7698 28-SEP-81                1250       1400         30
      7698 BLAKE                          MANAGER                           7839 01-MAY-81                2850                    30
      7782 CLARK                          MANAGER                           7839 09-JUN-81                2450                    10
      7788 SCOTT                          ANALYST                           7566 19-APR-87                3000                    20
      7839 KING                           PRESIDENT                              17-NOV-81                5000                    10
      7844 TURNER                         SALESMAN                          7698 08-SEP-81                1500          0         30
      7876 ADAMS                          CLERK                             7788 23-MAY-87                1100                    20
      7900 JAMES                          CLERK                             7698 03-DEC-81                 950                    30
      7902 FORD                           ANALYST                           7566 03-DEC-81                3000                    20
      7934 MILLER                         CLERK                             7782 23-JAN-82                1300                    10

用下面的语句显示如下:

SQL> SELECT ENAME,DEPTNO,EMPNO,ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY EMPNO) FROM SCOTT.EMP;

ENAME                              DEPTNO      EMPNO ROW_NUMBER()OVER(PARTITIONBYDEPTNOORDERBYEMPNO)
------------------------------ ---------- ---------- -----------------------------------------------
CLARK                                  10       7782                                               1
KING                                   10       7839                                               2
MILLER                                 10       7934                                               3
SMITH                                  20       7369                                               1
JONES                                  20       7566                                               2
SCOTT                                  20       7788                                               3
ADAMS                                  20       7876                                               4
FORD                                   20       7902                                               5
ALLEN                                  30       7499                                               1
WARD                                   30       7521                                               2
MARTIN                                 30       7654                                               3
BLAKE                                  30       7698                                               4
TURNER                                 30       7844                                               5
JAMES                                  30       7900                                               6

Oracle中的 row_number() over (partition by order by ) 用法

时间: 2024-10-05 12:37:42

Oracle中的 row_number() over (partition by order by ) 用法的相关文章

row_number() over (partition by....order by...)用法 分组排序

转载来源:http://www.cnblogs.com/Kazaf/archive/2011/06/30/2094015.html row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的) SELECT G.*, ROW_NUMBER() OVER(PARTITION BY a ,b ORDER BY c DESC) ROWN fr

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

Oracle 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的). 举例: SQL> DESC T1; Name                                           Null?    Type----------------------

Oracle中insert into select和select into的用法(转)

原文地址:http://hi.baidu.com/huahua035/item/87d5e71e6a7d31f187ad4ea5 两张表进行数据的拷贝,最常用的拷贝语句是: insert into select  和 select into from 但是请绝对的注意: 在Oracle中select into from不可以使用-----原因很简单:select into是PL/SQL language 的赋值语句!如果使用则Oracle会抛出0RA-00905:missing keyword的

oracle 之分析函数 over (partition by ...order by ...)

一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行. 1.分析函数和聚合函数的不同之处: 分析函数和聚合函数很多是同名的,意思也一样,只是聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值.简单的说就是聚合函数返回统计结果,分析函数返回明细加统计结果. (一).分析函数语法: FUNCTION_

ROW_NUMBER() OVER(PARTITION BY ORDER BY )RN 只选一行

select PEGGED_SO_ID,PEGGED_SO_LINE_ID ,ITEM_ID ,QUANTITY ,LOCATION ,SITEID from IN_SEMI_ONHAND_LOCKED where item_id in ('000000101011003137','000000102011000038') ; SELECT DISTINCT PEGGED_SO_ID,PEGGED_SO_LINE_ID ,ITEM_ID ,QUANTITY ,LOCATION ,SITEID ,

oracle查询中over(partition by ...order by ...)用法

例: rank() over(partition by deptno order by sal desc) rank 解释: deptno -- 部门, sal -- 工资 over:  在什么条件之上.partition by e.deptno:  按部门编号划分(分区).order by e.sal desc:  按工资从高到低排序(使用rank()/dense_rank() 时,必须要带order by否则非法)rank():  分级 整个语句的意思就是:在按部门划分的基础上,按工资从高到

用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中的exists和not exists和in用法详解

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. not exists:做NL,对子查询先查,有个虚表,有确定值,所以就算子查询有NULL最终也有值返回 not in:做hash,对子查询表建立内存数组,用外表匹配,那子查询要是有NULL那外表没的匹配最终无值返回.     一直以来认为exists比in效率高的说法是不准确的.   如果查询的两个表大小相当,那么用in和exists差别不大.  如果两个表中一个较小,一个是大表,则子

Oracle中的填充函数lpad和rpad的用法(转)

原文链接:http://blog.csdn.net/myzhanglt/article/details/7392999 今日学习遇到一个不熟悉的函数LPAD,查了一下文档,将其用法总结如下: Lpad Function:在PL/SQL中用于往源字符串的左侧填充一些字符. 函数参数:lpad( string1, padded_length, [ pad_string ] ) 其中 string1:源字符串 padded_length:最终返回的字符串的长度,如果最终返回的字符串的长度比源字符串的小