row_number over 函数

本文详细介绍了SQL中的窗口函数,包括row_number(), rank(), dense_rank()等的使用方法,并通过具体实例展示了如何利用这些函数进行数据排序和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

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

 

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

 

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

 

  lagarg1,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行。

 

语句四:

 

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行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值