当前位置:asp编程网>技术教程>Database教程>  正文

SQLServer2005新的高效分页方法-row_number()over函数的使用

2010-07-12 12:56:59   来源:    作者:佚名   浏览量:2370   收藏

Select * FROM (

    select ROW_NUMBER()Over(order by cf_id desc) as rowId,* from T_Test

) as mytable

where rowId between 21 and 40

每页20条,第2页

ROW_NUMBER是SqlServer2005中的新特性

以下是利用本方法和传统利用Set RowCount方法存储过程的效率比较结果:

未建索引情况下:

500w数据: 存储过程1分20秒 , 新方法1分18秒

400w数据:存储过程47秒,新方法41秒

300w数据:存储过程35秒,新方法30秒

200w数据:存储过程25秒,新方法20秒

100W数据:存储过程12秒,新方法10秒

50W数据:存储过程 7秒,新方法 0秒

------------------------------------------

以下信息,转自:http://hi.baidu.com/122439049/blog/item/0c9c48131b2734d5f7039e13.html

row_number()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;



关于我们-广告合作-联系我们-积分规则-网站地图

Copyright(C)2013-2017版权所属asp编程网