在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
|
电神魔傀2街机免费版 官方版v1.2.1
下载三国战纪2手游腾讯渠道服 安卓版v2.41.0.0
下载三国战纪2手游抖音渠道服 安卓版v2.41.0.0
下载三国战纪2折扣服 安卓版v2.41.0.0
下载叫我大掌柜小米版 安卓版v7.4.4
叫我大掌柜小米版是这款模拟经营类手游的渠道服版本,在此版本中
cooking fever正版 安卓最新版v23.0.2
cooking fever正版是一款非常好玩的模拟经营类手游
咖啡厅的生活故事 最新版v1.7
咖啡厅的生活故事是一款模拟经营游戏,玩家们在游戏中可以经营一
迅猛龙模拟器金币不减反增版 v1.1.8
迅猛龙模拟器无限金币版是一款动物模拟类游戏,玩家们将在游戏中
泽塔奥特曼升华器免广告版 v1.4
泽塔奥特曼升华器去广告版是游戏的破解版本,在该版本中为玩家去