gqinvs 发表于 2015-7-4 12:37:39

SQL Server 2005 中行号的显示,分页

  下面介绍一个SQL Server 2005 中的新东东:
ROW_NUMBER
返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
  语法:
ROW_NUMBER ( )   OVER ( [])
  备注:
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
  参数:

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

确定将 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)
页: [1]
查看完整版本: SQL Server 2005 中行号的显示,分页