`

用于产生排序编号的 row_number() over ,并支持分段内排序 (还有rank() 、dense_rank() 、lag() 等去加over)

阅读更多

row_number() OVER (PARTITION BY [col1] ORDER BY [col2]) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).

  与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

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

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

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

  lag(arg1,arg2,arg3): 
arg1是从其他行返回的表达式 
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 
arg3是在arg2表示的数目超出了分组的范围时返回的值。

 

 

看几个SQL语句:

 

语句一:

select row_number() over(order by sale/cnt desc) as sort, sale/cnt 
from (
select -60 as sale,3 as cnt from dual union 
select 24 as sale,6 as cnt from dual union 
select 50 as sale,5 as cnt from dual union 
select -20 as sale,2 as cnt from dual union 
select 40 as sale,8 as cnt from dual);

执行结果:

          SORT       SALE/CNT
---------- ----------
             1             10
             2              5
             3              4
             4            -10
             5            -20

 

 

 

语句二:查询员工的工资,按部门排序

select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp;

执行结果:

ENAME                           SAL      SAL_ORDER
-------------------- ---------- ----------
KING                           5000              1
CLARK                          2450              2
MILLER                         1300              3
SCOTT                          3000              1
FORD                           3000              2
JONES                          2975              3
ADAMS                          1100              4
SMITH                           800              5
BLAKE                          2850              1
ALLEN                          1600              2
TURNER                         1500              3
WARD                           1250              4
MARTIN                         1250              5
JAMES                           950              6

已选择14行。

语句三:查询每个部门的最高工资

select deptno,ename,sal from 
     (select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order 
         from scott.emp) where sal_order <2;

执行结果:

       DEPTNO ENAME                          SAL
---------- -------------------- ----------
           10 KING                          5000
           20 SCOTT                         3000
           30 BLAKE                         2850

已选择3行。

 

草木逢春注:排序号小于2就是第一名呗

 

语句四:

select deptno,sal,rank() over (partition by deptno order by sal) as rank_order from scott.emp order by deptno;

执行结果:

     DEPTNO         SAL RANK_ORDER
---------- ---------- ----------
         10        1300           1
         10        2450           2
         10        5000           3
         20         800           1
         20        1100           2
         20        2975           3
         20        3000           4
         20        3000           4
         30         950           1
         30        1250           2
         30        1250           2
         30        1500           4
         30        1600           5
         30        2850           6

已选择14行。

 

草木逢春注:排序号发生了自动跳跃

 

语句五:

select deptno,sal,dense_rank() over(partition by deptno order by sal) as dense_rank_order from scott.emp order by deptn;

执行结果:

     DEPTNO         SAL DENSE_RANK_ORDER
---------- ---------- ----------------
         10        1300                 1
         10        2450                 2
         10        5000                 3
         20         800                 1
         20        1100                 2
         20        2975                 3
         20        3000                 4
         20        3000                 4
         30         950                 1
         30        1250                 2
         30        1250                 2
         30        1500                 3
         30        1600                 4
         30        2850                 5

已选择14行。

 

草木逢春注:继续追加,排序号不会自动跳跃

 

语句六:

select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) as lag_ from scott.emp order by deptno;

执行结果:

 

 

     DEPTNO ENAME                        SAL LAG_
---------- -------------------- ---------- --------------------
         10 CLARK                       2450
         10 KING                        5000 CLARK
         10 MILLER                      1300 KING
         20 ADAMS                       1100
         20 FORD                        3000 ADAMS
         20 JONES                       2975 FORD
         20 SCOTT                       3000 JONES
         20 SMITH                        800 SCOTT
         30 ALLEN                       1600
         30 BLAKE                       2850 ALLEN
         30 JAMES                        950 BLAKE
         30 MARTIN                      1250 JAMES
         30 TURNER                      1500 MARTIN
         30 WARD                        1250 TURNER

已选择14行。

分享到:
评论

相关推荐

    oracle row_number用法

    `ROW_NUMBER()`可以与`RANK()`和`DENSE_RANK()`进行比较。这些函数都可以用来给数据排序并分配等级,但是它们在处理并列的情况时有所不同: - **Rank**:如果两个或多个行具有相同的排序值,则这些行都将获得相同...

    Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    ROW_NUMBER()函数用于为每个分组内的行分配一个唯一的序列号,这个编号是基于指定的排序条件。例如: ``` ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) ``` 这个表达式会根据`COL1`进行分组,然后在每...

    oracle分组排序统计高级用法

    其中`GROUP BY`、`ORDER BY`、`OVER`子句以及`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()`等分析函数都是非常有用的工具。在实际应用中,根据具体的需求选择合适的工具和技术组合可以大大提高数据处理的效率和灵活性。...

    hive开窗函数.docx

    ROW_NUMBER() 函数用于为查询结果的每一行赋予一个唯一的序号。这个序号是基于指定的排序条件(如某个列的名字)生成的。这在需要按照特定顺序对数据进行编号时非常有用。例如,你可以按照时间戳对事件进行排序并为...

    ORACLE_OVER函数

    OVER函数通常与窗口函数(如RANK(), DENSE_RANK(), ROW_NUMBER(), SUM(), AVG()等)一起使用。其基本语法形式如下: ```sql &lt;window_function&gt; OVER ( [window_spec] ) ``` 其中`&lt;window_function&gt;`代表具体的窗口...

    oracle 的几个分析函数

    与ROW_NUMBER()类似,RANK()也用于为行编号。但当有多个行具有相同的排序值时,RANK()会跳过一些数字。例如,如果有两个员工在同一个部门且工资相同,他们会获得相同的排名,而接下来的员工排名将是当前排名加2。 ...

    ORACLE分析函数.pdf

    2. 排序函数 (RANK, DENSE_RANK, ROW_NUMBER) 这些函数用于在特定分组或全表中为行分配唯一的序号。 - RANK():如果两行在同一组中的值相同,它们将被赋予相同的排名,然后跳过下一个排名。 - DENSE_RANK():与RANK...

    oracle常用分析函数与聚合函数的用法

    2. `DENSE_RANK()`: 与`RANK()`类似,`DENSE_RANK()`也用于排序,但它不会跳过排名。如果存在相同值,所有这些值都将获得相同的排名,然后下一个值将获得紧接着的排名。这确保了排名的连续性,避免了空缺的排名。 3...

    oracle分析函数在BI分析中应用事例

    `over`关键字定义了一个分析上下文,`partition by`用于将数据分组,而`order by`则决定了组内的排序方式。`range between`用于定义滑动窗口,它可以基于数值或日期,`preceding`和`following`指定窗口边界。 2. **...

    oracle 常用函数下载

    - `ROW_NUMBER() OVER (PARTITION BY superid ORDER BY id)` 为每个superid分组内部按id排序并分配唯一的行号。 - `RANK() OVER (ORDER BY superid)` 和 `ROW_NUMBER()` 类似,但并列排名时会跳过编号。 - `DENSE...

    oracle分析函数学习

    - 窗口函数(如RANK, DENSE_RANK, ROW_NUMBER)在选定的窗口内进行计算,窗口可以是整个结果集,也可以是根据某些条件定义的子集。 - 报表函数(如CUME_DIST, PERCENT_RANK)通常用于计算相对位置或百分比分布,...

    深入浅出Oracle分析函数

    Oracle中的分析函数主要包括RANK()、DENSE_RANK()、ROW_NUMBER()用于排名,LEAD()和LAG()用于获取当前行前后行的值,FIRST_VALUE()和LAST_VALUE()用于获取分区的第一行和最后一行的值,以及SUM()、AVG()、MIN()、MAX...

    Oracle之分析函数讲解及PPT资源.zip

    分析函数主要有RANK()、DENSE_RANK()、ROW_NUMBER()、LEAD()、LAG()、FIRST_VALUE()、LAST_VALUE()、AVG() OVER()、SUM() OVER()、MIN() OVER()、MAX() OVER()等。它们可以分为排名函数、窗口函数和分组计算函数三类...

    Oracle分析函数

    DENSE_RANK 函数用于计算行的相对排序,相同的值具有一样的序数。 3.8 FIRST_VALUE 函数 FIRST_VALUE 函数用于获取一个组的第一个值。 3.9 LAG 函数 LAG 函数用于访问之前的行。 3.10 LAST_VALUE 函数 LAST_...

    深入浅出oracle分析函数(全)

    例如,`ROW_NUMBER()`、`RANK()`和`DENSE_RANK()`函数用于为每个分区内的行分配唯一的序号。 2. **Rank函数家族**: - `ROW_NUMBER()`:为每一行提供唯一的数字标识,即使有相同的值,也会连续计数。 - `RANK()`...

    oracle分析函数.doc

    - 排序函数:`RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`,用于为数据行分配唯一的排名。 - 分组函数:如`NTILE()`,将数据行分成等大小或不等大小的组。 - 首尾函数:`FIRST_VALUE()`, `LAST_VALUE()`,返回指定...

    【转】Oracle分析函数简述

    OVER()子句中的PARTITION BY子句用于将数据划分为多个分区,ORDER BY子句则对每个分区内的行进行排序。 例如,以下SQL查询展示了如何使用ROW_NUMBER()和OVER()子句为每个部门的员工分配一个序列号: ```sql SELECT...

Global site tag (gtag.js) - Google Analytics