下面介绍一个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
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)
SELECT @PageIndex = 1
SELECT TOP 3 * FROM
(
SELECT row_number() OVER (ORDER BY F1 ASC) AS F1Order, * FROM #T
) A
WHERE F1Order > (@PageIndex * 3)
转自:http://blog.csdn.net/panys/archive/2007/11/12/1880589.aspx
分类:
050~sqlserver
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)