下面介绍一个SQL Server 2005 中的新东东:ROW_NUMBER 返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
语法: ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
备注: ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数: <partition_by_clause> 将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。 <order_by_clause> 确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型: bigint
示例:
Select * INTO #T FROM ( Select 2 F1, ' AA ' F2, ' 101 ' F3 UNION ALL Select 1 F1, ' AA ' F2, ' 102 ' F3 UNION ALL Select 4 F1, ' BB ' F2, ' 103 ' F3 UNION ALL Select 5 F1, ' CC ' F2, ' 104 ' F3 UNION ALL Select 3 F1, ' AA ' F2, ' 105 ' F3 UNION ALL Select 7 F1, ' BB ' F2, ' 106 ' F3 UNION ALL Select 6 F1, ' CC ' F2, ' 107 ' F3 UNION ALL Select 5 F1, ' CC ' F2, ' 108 ' F3 ) T1 -- 1 Select row_number() OVER ( ORDER BY F1 ASC ) AS F1Order, * FROM #T -- 先按照F1顺序,再加上顺序号F1Order,结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 1 1 AA 102 2 2 AA 101 3 3 AA 105 4 4 BB 103 5 5 CC 104 6 5 CC 108 7 6 CC 107 8 7 BB 106 -- 2 Select row_number() OVER ( ORDER BY F1 DESC ) AS F1Order, * FROM #T -- 先按照F1倒序,再加上顺序号F1Order,结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 1 7 BB 106 2 6 CC 107 3 5 CC 108 4 5 CC 104 5 4 BB 103 6 3 AA 105 7 2 AA 101 8 1 AA 102 -- 3 Select row_number() OVER ( ORDER BY F1 ASC ) AS F1Order, * FROM #T ORDER BY F1 ASC -- 先按照F1顺序,再加上顺序号F1Order,再把结果按F1顺序显示,结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 1 1 AA 102 2 2 AA 101 3 3 AA 105 4 4 BB 103 5 5 CC 104 6 5 CC 108 7 6 CC 107 8 7 BB 106 -- 4 Select row_number() OVER ( ORDER BY F1 ASC ) AS F1Order, * FROM #T ORDER BY F1 DESC -- 先按照F1顺序,再加上顺序号F1Order,再把结果按地F1倒序显示,注意顺序号F1Order也倒过来了,保持位置相对不变,结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 8 7 BB 106 7 6 CC 107 5 5 CC 104 6 5 CC 108 4 4 BB 103 3 3 AA 105 2 2 AA 101 1 1 AA 102 -- 5 Select row_number() OVER ( ORDER BY F1 DESC ) AS F1Order, * FROM #T ORDER BY F1 ASC -- 先按照F1倒序,再加上顺序号F1Order,再把结果按地F1顺序显示,注意顺序号F1Order也倒过来了,保持位置相对不变,结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 8 1 AA 102 7 2 AA 101 6 3 AA 105 5 4 BB 103 3 5 CC 108 4 5 CC 104 2 6 CC 107 1 7 BB 106 -- 6 Select row_number() OVER ( ORDER BY F1 DESC ) AS F1Order, * FROM #T ORDER BY F1 DESC -- 先按照F1倒序,再加上顺序号F1Order,再把结果按地F1倒序显示,结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 1 7 BB 106 2 6 CC 107 3 5 CC 108 4 5 CC 104 5 4 BB 103 6 3 AA 105 7 2 AA 101 8 1 AA 102 -- 7 Select row_number() OVER (PARTITION BY F2 ORDER BY F1 ASC ) AS F1Order, * FROM #T -- 先按照F2分组,再按F1顺序,再加上顺序号F1Order,是分组加哦。结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 1 1 AA 102 2 2 AA 101 3 3 AA 105 1 4 BB 103 2 7 BB 106 1 5 CC 104 2 5 CC 108 3 6 CC 107 -- 8 Select row_number() OVER (PARTITION BY F2 ORDER BY F1 DESC ) AS F1Order, * FROM #T -- 先按照F2分组,再按F1倒序,再加上顺序号F1Order,是分组加哦。结果如下: F1Order F1 F2 F3 -- ------------------ ----------- ---- ---- 1 3 AA 105 2 2 AA 101 3 1 AA 102 1 7 BB 106 2 4 BB 103 1 6 CC 107 2 5 CC 108 3 5 CC 104
最后,可以利用row_number(),可以进行自定义分页,Top 3是每页记录数,pageIndex就是我们需要数据的页数。是不是很简单?
DECLARE @PageIndex INT Select @PageIndex = 1 Select TOP 3 * FROM ( Select row_number() OVER ( ORDER BY F1 ASC ) AS F1Order, * FROM #T ) A Where F1Order > ( @PageIndex * 3 )转载于:https://www.cnblogs.com/liyejun/archive/2009/03/25/1421243.html
相关资源:JAVA上百实例源码以及开源项目