在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
|
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔