在sql使用中,我们可能经常会碰到这样的需求,即每类信息取前几条显示出来。 实现的方法有很多种,但考虑到效率问题。今天我们使用sql server2005里row_number()这个函数。
ROW_NUMBER ( ) 函数的语法如下: ROW_NUMBER ( ) OVER ( [ ] )
OVER 子句中的 PARTITION BY 将结果集分为多个分区。
OVER 子句中的 ORDER BY 将对 ROW_NUMBER 进行排序。
假如要从article表中得到每个分类的10条数据,并且倒序排序,那么最终的sql语句如下:
| 代码如下 | 复制代码 |
|
select id,title,class,addtime from(select id,title,class,addtime,row_number() select id,title,class,addtime,row_number() |
|
首先,从article表里按类型(class)分类,并对每类进行了排序,序号为(rowindex)。最后,从每类取出前10条。即实现了我们的目的。 经过测试,此种写法效率较高,推荐大家使用
现在我们来看一个例子
| 代码如下 | 复制代码 |
| CREATE TABLE table1( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](128) NOT NULL, [class] int not null, [date] datetime not null) | |
class 表示分类编号。 分类数不固定, 至少有上千种分类
date 表示该条记录被更新的时间
我们现在想获得每个分类最新被更新的5条记录。
解决方案
| 代码如下 | 复制代码 |
|
select id,name,class,date from(select id,name,class,date ,row_number() over(partition by class order by date desc)as rowindex from table1) awhere rowindex <= 5 create table #temp (
2 天津旺旺有限公司 汽车5 2010-08-01 00:00:00.000
3 杭州大明有限公司 汽车3 2010-08-01 00:00:00.000
4 北京小科有限公司 汽车4 2010-08-01 00:00:00.000
getdata2005 4
|
|
猪笼城寨手游
猪笼城寨游戏是非常好玩的一款模拟经营类型的手游,在这里玩家们
商道高手vivo版本
商道高手vivo版是一款商战题材的模拟经营手游,游戏画面精美
我在大清当皇帝手游
我在大清当皇帝手游是一款以清代为历史的模拟类手游,相信玩家们
解忧小村落最新版2024
解忧小村落游戏是非常好玩的一款休闲放置经营类型的手游,在这里
洋果子店rose2中文版
洋果子店rose2中文版是一款非常好玩的模拟经营手游,精美的