每个分类取最新的几条的SQL实现(转载记录)
假设我们有下面这样结构的一张表,这张表的数据量非常巨大。
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) a
where rowindex <= 5
解决方案简单说明:
这个解决方案的关键就是使用了SQL 2005 的 ROW_NUMBER 这个全新的函数。
ROW_NUMBER ( ) 函数的语法如下:
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
OVER 子句中的 PARTITION BY 将结果集分为多个分区。
OVER 子句中的 ORDER BY 将对 ROW_NUMBER 进行排序。
本文转摘自『蓝派网』http://www.lan27.com/Article/200805/7338.htm
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) a
where rowindex <= 5
解决方案简单说明:
这个解决方案的关键就是使用了SQL 2005 的 ROW_NUMBER 这个全新的函数。
ROW_NUMBER ( ) 函数的语法如下:
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
OVER 子句中的 PARTITION BY 将结果集分为多个分区。
OVER 子句中的 ORDER BY 将对 ROW_NUMBER 进行排序。
本文转摘自『蓝派网』http://www.lan27.com/Article/200805/7338.htm