<!-- 分页查询
select * from
(select row_number() over(order by id desc) as row_number,* from (要分页的数据) as r) as row_
where row_.row_number between 起始数@a and 结束数@b
@a (页码-1)*页记录数+1
@b 页码*页记录数
-->
可以联合视图进行操作,可能会更清晰
下面再转篇mssql2005排名函数的文章(http://www.cnblogs.com/xlx0210/archive/2009/07/23/1529613.html)
SELECT * FROM (SELECT bh,title,time,row_number() OVER(ORDER BY bh) AS row FROM shang_cms_news WHERE smallclass=6 ) C WHERE (row between 5 and 7 )
1. row_number
2. rank
3. dense_rank
4. ntile
下面分别介绍一下这四个排名函数的功能及用法。在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示:
图1
其中field1字段的类型是int,field2字段的类型是varchar
一、row_number
row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:
select row_number() over(order by field1) as row_number,* from t_table
上面的SQL语句的查询结果如图2所示。
图2
其中row_number列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。
实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示:
select row_number() over(order by field2 desc) as row_number,* from t_table order by field1 desc
上面的SQL语句的查询结果如图3所示。
图3
我们可以使用row_number函数来实现查询表中指定范围的记录,一般将其应用到Web应用程序的分页功能上。下面的SQL语句可以查询t_table表中第2条和第3条记录:
with t_rowtable
as
(
select row_number() over(order by field1) as row_number,* from t_table
)
select * from t_rowtable where row_number>1 and row_number < 4 order by field1
上面的SQL语句的查询结果如图4所示。
图4
上面的SQL语句使用了CTE,关于CTE的介绍将读者参阅《SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL》。
另外要注意的是,如果将row_number函数用于分页处理,over子句中的order by 与排序记录的order by 应相同,否则生成的序号可能不是有续的。
当然,不使用row_number函数也可以实现查询指定范围的记录,就是比较麻烦。一般的方法是使用颠倒Top来实现,例如,查询t_table表中第2条和第3条记录,可以先查出前3条记录,然后将查询出来的这三条记录按倒序排序,再取前2条记录,最后再将查出来的这2条记录再按倒序排序,就是最终结果。SQL语句如下:
select * from (select top 2 * from( select top 3 * from t_table order by field1) a order by field1 desc) b order by field1
上面的SQL语句查询出来的结果如图5所示。
图5
这个查询结果除了没有序号列row_number,其他的与图4所示的查询结果完全一样。
二、rank
rank函数考虑到了over子句中排序字段值相同的情况,为了更容易说明问题,在t_table表中再加一条记录,如图6所示。
图6
在图6所示的记录中后三条记录的field1字段值是相同的。如果使用rank函数来生成序号,这3条记录的序号是相同的,而第4条记录会根据当前的记录 数生成序号,后面的记录依此类推,也就是说,在这个例子中,第4条记录的序号是4,而不是2。rank函数的使用方法与row_number函数完全相 同,SQL语句如下:
select rank() over(order by field1),* from t_table order by field1
上面的SQL语句的查询结果如图7所示。
图7
三、dense_rank
dense_rank函数的功能与rank函数类似,只是在生成序号时是连续的,而rank函数生成的序号有可能不连续。如上面的例子中如果使用dense_rank函数,第4条记录的序号应该是2,而不是4。如下面的SQL语句所示:
select dense_rank() over(order by field1),* from t_table order by field1
上面的SQL语句的查询结果如图8所示。
图8
读者可以比较图7和图8所示的查询结果有什么不同
四、ntile
ntile函数可以对序号进行分组处理。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记 录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。ntile函数有一个参数,用来指定桶数。下 面的SQL语句使用ntile函数对t_table表进行了装桶处理:
select ntile(4) over(order by field1) as bucket,* from t_table
上面的SQL语句的查询结果如图9所示。
图9
由于t_table表的记录总数是6,而上面的SQL语句中的ntile函数指定了桶数为4。
也许有的读者会问这么一个问题,SQL Server2005怎么来决定某一桶应该放多少记录呢?可能t_table表中的记录数有些少,那么我们假设t_table表中有59条记录,而桶数是5,那么每一桶应放多少记录呢?
实际上通过两个约定就可以产生一个算法来决定哪一个桶应放多少记录,这两个约定如下:
1. 编号小的桶放的记录不能小于编号大的桶。也就是说,第1捅中的记录数只能大于等于第2桶及以后的各桶中的记录。
2. 所有桶中的记录要么都相同,要么从某一个记录较少的桶开始后面所有捅的记录数都与该桶的记录数相同。也就是说,如果有个桶,前三桶的记录数都是10,而第4捅的记录数是6,那么第5桶和第6桶的记录数也必须是6。
根据上面的两个约定,可以得出如下的算法:
// mod表示取余,div表示取整
if(记录总数 mod 桶数 == 0)
{
recordCount = 记录总数 div 桶数;
将每桶的记录数都设为recordCount
}
else
{
recordCount1 = 记录总数 div 桶数 + 1;
int n = 1; // n表示桶中记录数为recordCount1的最大桶数
m = recordCount1 * n;
while(((记录总数 - m) mod (桶数 - n)) != 0 )
{
n++;
m = recordCount1 * n;
}
recordCount2 = (记录总数 - m) div (桶数 - n);
将前n个桶的记录数设为recordCount1
将n + 1个至后面所有桶的记录数设为recordCount2
}
根据上面的算法,如果记录总数为59,桶数为5,则前4个桶的记录数都是12,最后一个桶的记录数是11。
如果记录总数为53,桶数为5,则前3个桶的记录数为11,后2个桶的记录数为10。
就拿本例来说,记录总数为6,桶数为4,则会算出recordCount1的值为2,在结束while循环后,会算出recordCount2的值是1,因此,前2个桶的记录是2,后2个桶的记录是1。
分享到:
相关推荐
php+mssql分页类,自己用的,借鉴了一下别人的,简单的封装了一下。
**MSSQL 分页** 在数据库管理中,分页是一种常用的技术,用于处理大量数据时,提高用户体验并优化系统性能。MSSQL(Microsoft SQL Server)作为一款强大的关系型数据库管理系统,提供了多种分页方法来处理查询结果...
根据提供的文件信息,我们可以总结出以下关于 PHP 与 MSSQL 分页实现的相关知识点: ### 一、PHP 和 MSSQL 的连接 在 PHP 中通过 `mssql_connect` 函数可以建立与 MSSQL 数据库的连接。具体操作如下: ```php $...
这个是经过我修改的分页类,只需要语句就可以直接实现从数据库里取出数据并分页,不过CSS得自己写,里面附带例子
综上所述,这个"oracle和mssql分页存储过程-均通用"的压缩包文件提供了一个跨平台的解决方案,帮助开发者在Oracle和MSSQL数据库中轻松实现高效的分页查询,同时提高了代码的可维护性和复用性。在实际应用中,应结合...
### PHP与MSSQL简单分页实现方法 在本文中,我们将探讨如何使用PHP与Microsoft SQL Server(简称MSSQL)来实现一个简单的分页功能。分页是Web开发中的一个重要概念,它允许用户通过多页浏览大量数据,而不是一次性...
在SQL Server (MSSQL) 中,组合查询和分页查询是数据库操作中常见的需求,尤其是在处理复杂的业务逻辑和用户交互时。以下是对这两种查询方式的详细解释。 **组合查询**,也称为联接查询或复合查询,允许你将多个...
在标题和描述中提到的“mssql+group by 分页例子”是指在SQL Server(通常简称为mssql)中使用`GROUP BY`结合分页技术来处理大量数据的方法。这里我们将详细探讨这个主题,并给出实际的例子。 首先,`GROUP BY`子句...
以下是一些关于MSSQL 2000的语法、分页、函数和存储过程的知识点: 1. **分页查询**: - `TOP`关键字用于获取指定数量的行。例如,`SELECT TOP n * FROM table` 可以获取表中的前n行。 - 为了实现分页,可以结合`...
在这个场景中,我们关注的是使用Java Server Pages (JSP) 和 Microsoft SQL Server (MSSQL) 实现网页的分页搜索功能。下面将详细阐述这两个技术如何协同工作以实现这一目标。 **JSP (Java Server Pages)** JSP 是一...
以下将详细介绍PHP与MSSQL数据库配合实现分页查询的方法。 在SQL Server中,分页查询通常使用`TOP`关键字来限制返回的行数。为了实现从第M条记录开始取N条记录的效果,可以使用嵌套的`SELECT`语句。具体如下: ```...
本示例着重于在MSSQL 2005中利用存储过程实现分页处理的高级技巧。分页是数据查询中常见的一种需求,尤其是在Web应用程序中,它能够有效地管理大量数据,提高用户体验,避免一次性加载所有记录导致的性能问题。 ...
直接复制到新建查询里面创建,使用的时候注意里面的参数
MSSQL 2005(Microsoft SQL Server 2005)是微软公司推出的关系型数据库管理系统,用于存储、管理和处理数据。将PHP与MSSQL 2005结合使用,开发者可以利用PHP的灵活性和MSSQL的强大数据库功能。 当我们谈论"php操作...
SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。
**Ajax + JSP + MSSQL 分页技术详解** 在Web开发中,为了提高用户体验,我们经常需要实现数据的分页显示。本教程将详细介绍如何利用Ajax、JSP和MSSQL数据库来创建一个高效的分页系统。对于初学者来说,这是一次了解...
php mssql分页类,虚拟静态中可用