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): 看几个SQL语句: 语句一: select row_number() over(order by sale/cnt desc) as sort, sale/cnt 执行结果: SORT SALE/CNT 语句二:查询员工的工资,按部门排序 select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp; 执行结果: ENAME SAL SAL_ORDER 已选择14行。 语句三:查询每个部门的最高工资 select deptno,ename,sal from 执行结果: DEPTNO ENAME SAL 已选择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 已选择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 已选择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_ 已选择14行。 |